dionaeaのサービスを見てみる
とりあえず、公式のこのページを参考に1つずつ見ていけたらなぁと思ってます。
Service — dionaea 0.8.0 documentation
その前に
外部からnmapをした時に、dionaeaとバレてしまう可能性があるのでそれを修正します。参考サイトはこちらです。
# nmap ipアドレス -sV Host is up (0.039s latency). Not shown: 986 closed ports PORT STATE SERVICE VERSION 21/tcp open ftp Synology DiskStation NAS ftpd 22/tcp open ssh OpenSSH 6.6.1p1 Ubuntu 2ubuntu2.10 (Ubuntu Linux; protocol 2.0) 23/tcp open telnet? 42/tcp open tcpwrapped 53/tcp open domain? 80/tcp open http nginx 135/tcp open msrpc? 443/tcp open ssl/http nginx 445/tcp open microsoft-ds Dionaea honeypot smbd 1433/tcp open ms-sql-s Dionaea honeypot MS-SQL server 1723/tcp open pptp (Firmware: 1) 3306/tcp open mysql MySQL 5.7.16 5060/tcp open sip? 5061/tcp open ssl/sip-tls? Service Info: Host: ; OS: Linux; Device: storage-misc; CPE: cpe:/o:linux:linux_kernel Service detection performed. Please report any incorrect results at https://nmap.org/submit/ . Nmap done: 1 IP address (1 host up) scanned in 160.80 seconds
smbとmssqlの部分でDionaeaと表示されてしまっているので、この二つが修正対象。このサイトにnmapが検出に使用するシグネチャがある。詳しくは参考サイトで解説してくれているので省きますが、grepコマンドで'dionaea'を検索すれば、どのプロトコルがどのシグネチャで検出しているかわかります。
smb
"SMB Negotiate Protocol Response"に含まれる"OemDomainName"と"ServerName"の値をチェックしているとのこと。
/opt/dionaea/lib/dionaea/python/dionaea/smb/include/smbfields.pyの755行目と759行目を変更する。ここは環境やバージョンによって変わるかもしれないので、自分で検索かけて見てください。
と思ったのですが、ここ以外に依存している部分があるっぽいです。/opt/dionaea/lib/dionaea/python/dionaea/smb/extras.pyの20行目あたりがそれに該当します。
データベースに接続する際のpre-login TDS package (Tabular Data Streams)の情報をチェックしている。Token Typeの値が0x00になっているので,これを0x01に変更する./opt/dionaea/lib/dionaea/python/dionaea/mssql/mssql.pyの147行目にある。これもバージョンによって違うかもしれない。
これ以外は一応dionaeaの名前は表示されていなかったので、okとします。では一度再起動かけて再びnmapでポートスキャンを行って見ましょう。
一応dionaeaの名前は消えたのでハニーポットとはバレなくなりましたが、下にメッセージが出るようになりました。どうやら手元にない情報の帰り方をすると、情報提供してね、って通知されているようです。ハニーポットってバレなくはなったのでとりあえずよしとします。
では色々とサービスを見て見ます。
ftp
File Transfer Protocol.
特定のコンピュータ間でファイル転送する時に使用するアプリケーション層のプロトコルです。Telnet/SSHと同様、相手先コンピュータにログインした上でファイル転送を行います。FTPを利用すればファイルをFTPサーバにアップロードしたり、FTPサーバからダウンロードしたりできます。FTPでは、ログインする際にやりとりするユーザ名とパスワード情報は、暗号化されずにそのまま送信されるのでセキュアなFTP通信を行いたい場合、FTPS(FTP over SSL/TLS)や、SFTP(SSH FTP)を使用します。
https://www.infraexpert.com/study/tcpip20.html
ftpはtcpで通信するので、udpのポートは開けてません。ウェルカムメッセージは接続時に表示されるものなので、適当に編集しても大丈夫そう。編集後自宅ネットワークからftpで繋いでみると、今設定したメッセージが初めに届いてることが確認できるかと思います。けど実際に動かそうとしたらget,putあたりで接続切れてしまいました。そこまで実装されていない感じでしょうか?/opt/dionaea/etc/dionaea/services-enabled/ftp.yamlのrootで指定したフォルダがftpに接続した時に初めに到達する場所になってます。なので本来はここ以下にftpでやり取りした結果が保存されていくのでしょう。
telnet
telnetは外部のコンピュータにアクセスするコマンド。パソコンやネットワークが今ほど発達していない時代は、メインコンピュータという1台の大型コンピュータに端末という形で複数のユーザーが接続し、利用していた。
https://eng-entrance.com/linux-command-telnet
http
これは特に調べる必要はないかと。80ポートはtcp,udp共にhttpで予約されているとのことですが、あくまでtcpを使用せよとの規定になっているので、tcpのみを開けておけばokです。/opt/dionaea/var/dionaea/roots/www/にindex.html等のページを設置しておけば、ブラウザからアクセス可能になります。http.yamlのrootでそのフォルダを設定しているのでそこを見てください。後の設定はちょっとまだわからないです。ごめんなさい。
mssql
Microsoft SQL Serverで1433ポートで待っている。phpとかでlinuxからサーバへアクセスができるっぽいです。
pptp
PPTP (Point-to-Point Tunneling Protocol) は、TCP/IP ベースのデータ ネットワーク上に仮想プライベート ネットワーク (VPN:Virtual Private Network) を作り出すことにより、リモート ユーザーから企業のサーバーへの安全なデータ転送を可能にするためのネットワーク プロトコルです。PPTP は、インターネットのような公共のネットワークを経由して、オンデマンドで接続可能で、マルチプロトコルがサポートされる仮想的なプライベート ネットワークを構築可能にします。
https://technet.microsoft.com/ja-jp/library/Gg983536.aspx
ポートは1723でした。
mysql
省略。
sip
Session Initiation Protocol. TCP/IPネットワーク上の複数の地点間で固定的な通信路(セッション)の確立や切断などを行うためのプロトコル(通信規約)の一つ。主に音声通話のような双方向のリアルタイム通信を行うために用いられる。
SIP(Session Initiation Protocol)とは - IT用語辞典
まとめ
内容がなんか薄い気がしますが、無知なゆえ致し方なし。ログの取り方とか、サービスの待ち受け方とか自分でカスタマイズしていかなければいけないのかなと、調べてるうちに感じてきました。多分できますよね。頑張ります。
dionaeaのVPSのポートがclosedばっかり - ハニーポットのポートが開かない
先日dionaeaをVPSに導入し、早く攻撃来ないかなとか思ってたんですが、全く来ないしログも増えない。すぐにおかしいなと思って、自分(VPS内から)をnmapでポートスキャン。
次に外部(自宅環境)からポートスキャン。
外から見るとポートが閉じてますね。他の方が書いている記事はこの辺り触れてなかったですけど、常識ってことでしょうか?どうやら私はまだ知識不足っぽいですね、、反省です。
動作環境
$ cat /etc/lsb-release DISTRIB_ID=Ubuntu DISTRIB_RELEASE=14.04 DISTRIB_CODENAME=trusty DISTRIB_DESCRIPTION="Ubuntu 14.04.5 LTS" $ uname -a Linux tk2-207-13081 3.13.0-157-generic #207-Ubuntu SMP Mon Aug 20 16:44:59 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
設定を変更する
ubuntu14をいじっているのですが、どうやらiptablesというのが噛んでいる様子。以下のサイトを参考にしました。
help.sakura.ad.jp
sekisuiseien.com
とりあえず、私の環境では設定ファイルは以下にありました。
/etc/iptables/
コマンドからでも設定を追加・変更できるらしいので、コマンドで打っていきます。
#80を別のポート番号に変更してあげればそのポートを設定できる iptables -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
これで状況を確認して見ましょう。
#現在の状況を表示 iptables -L
先ほどはなかった(スクショ取ってなかった)httpの文字が追加されてますね。試しに自宅環境から80番をnmapして見ましょう。
オープンしてました!試しにブラウザで自分のVPSのipにアクセスしても、一応応答が帰ってくるようになりました!
ufw
上の方法でとりあえず、攻撃が来ない理由が判明しました。本当はこの後ufwで設定を変更していこうと思っていたのですが、なぜかufwの変更が反映されず(ufwコマンドでの確認上は開いている). 仕方ないので(というか正当手段ですが)iptablesをいじっていくことにします!参考にさせてもらったのは以下のサイトさんです。
knowledge.sakura.ad.jp
qiita.com
2つ目のサイトを見てもらえると思うのですが、今回導入したubuntuはさくらVPSが用意したubuntu14だったので、iptablesの扱いが若干違っていたように感じます。iptablesのルールを永続的に変更するには以下のファイルをいじってください。
/etc/iptables/iptables.rules
今回はとりあえず以下のようにしようと思います。許可したポートはdionaeaを起動した時にnmap で表示される奴らです。
*filter :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [0:0] # established connection -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # icmp limit if get 20/m -A INPUT -p icmp -j ACCEPT # loop back(me to me) -A INPUT -i lo -j ACCEPT -A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT #DNS -A INPUT -p udp --sport 53 ACCEPT #user defines -A INPUT -p tcp --dport 21 ACCEPT -A INPUT -p tcp --dport 23 ACCEPT -A INPUT -p tcp --dport 42 ACCEPT -A INPUT -p tcp --dport 80 ACCEPT -A INPUT -p tcp --dport 135 ACCEPT -A INPUT -p tcp --dport 443 ACCEPT -A INPUT -p tcp --dport 445 ACCEPT -A INPUT -p tcp --dport 1433 ACCEPT -A INPUT -p tcp --dport 1723 ACCEPT -A INPUT -p tcp --dport 3306 ACCEPT -A INPUT -p tcp --dport 5060 ACCEPT -A INPUT -p tcp --dport 5061 ACCEPT COMMIT
これで、再起動をすると以降上の設定でiptablesが動くと思います。無事、ハニーポットも攻撃を受けているログを吐き出し始めました!
まとめ
いろんなサイトさんを見ましたがこのポート系には全く触れていなかったので、これをやるのは基本のキなのか、はたまたさくらVPSのubuntu14のみ初期設定でポートが閉じていたのかはわかりませんが、とりあえず色々触ることができたので結果良かったかなと思います。次なんかするときは、自分でイメージファイル用意しようかと思います。
今更さくらVPS借りてパニーポット(dionaea)
タイトル通り。
T-Potとかいうdionaeaとかを含んでなおかつログ等もうまい具合に可視化してくれるとかいう高級なものはのちに利用するとして、今回は自分でログとかを見ることを目的にdionaeaを入れます。
VPSを契約する & OS設定
とりあえずRAM1GB/HDD100GB/2Coreが約1000円/月なのでこれでチャレンジしようかなと思います。2週間お試し無料なのであまりにも重かったら考え直します。(と思ったけど最初の申し込みで2ヶ月先まで支払っているっぽい.)また初期投資で1620円かかりますが、しゃーなし。
てことで、ささっと申し込みをしました。この後どうするんだろうと思ったのですが、私はクレジットで支払ったので15分以内に仮パスワード等のメールが届くとのこと。詳しくは、入門ページでわかりやすく書いてあったのでここを見ました!
とりあえずubuntu14をインストール。PermitRootLoginの設定をいじるとのことでしたが、デフォルトでRootはパスワードでの接続ができない設定になっていた(without-password)のでそのまま。(実際にsshとかでrootログインができなかったはず。)ユーザ名はOSを入れなおすときに表示してあったので覚えておきましょう。それ入門記事はとりあえずは使わないので、目を通すぐらい。
2018/9/7,18:00追記
なんか22番ポートを開けておくのは嫌なので、sshを別ポートで待ち受けようと思います。私はさくらVPSさんのubuntuを使用しているので、sshの設定ファイルが他の人と異なっているかと思います。
# /etc/ssh/sshd_config Port 2220 ... PermitRootLogin no
それから次の記事(一番下のリンク)で書いているのですが、2220ポートを開けてあげないと接続できません。iptablesの設定ファイルで22ポートを許可している行を2220に変更してしまいましょう。終わったら再起動をかけるなりして変更を適用します。
追記ここまで
動作環境
$ cat /etc/lsb-release DISTRIB_ID=Ubuntu DISTRIB_RELEASE=14.04 DISTRIB_CODENAME=trusty DISTRIB_DESCRIPTION="Ubuntu 14.04.5 LTS" $ uname -a Linux tk2-207-13081 3.13.0-157-generic #207-Ubuntu SMP Mon Aug 20 16:44:59 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
dionaeaを導入する
ここからは以下のサイトさんを参考にします。
qiita.com
もしくは公式サイトさんのページを参考にしてもok
Installation — dionaea 0.8.0 documentation
#サイトさんより引用 # パッケージアップデート $ sudo apt-get update $ sudo apt-get dist-upgrade # PPAを管理するツールをインストール $ sudo apt-get install software-properties-common # Nightly Packageを追加し、キャッシュをアップデート $ sudo add-apt-repository ppa:honeynet/nightly $ sudo apt-get update $ sudo apt-get install dionaea
設定
デフォルトのままで動くらしいです。詳しくは先ほどのサイトで書いてくれているので、わざわざ僕が書き写す必要もないでしょう。けどとりあえず設定ファイルのパスぐらいは載せます。
/opt/dionaea/etc/dionaea/dionaea.cfg
私がとりあえず変更したのは蓄積させるログをdebug以外に設定したことぐらいです。
起動
#dionaeaを起動する $ sudo service dionaea start #状態の確認 $ sudo service dionaea status $停止 $ sudo service dionaea stop #ログの確認 tail -f /opt/dionaea/var/dionaea/dionaea.log #攻撃ログの確認 $ sudo tail -f /opt/dionaea/var/dionaea/bistreams #マルウェア格納場所 $ ls -l /opt/dionaea/var/dionaea/binaries/
操作とか
#自分のポートスキャン $ nmap <IPアドレス> #自分のプロセス表示 $ ps alx $ ps aux
サービスの設定
Service — dionaea 0.8.0 documentation
公式のこのページ通り、サービスごとに色々と設定をいじることができます。
場所は以下です。
$ cd /opt/dionaea/etc/dionaea/services-enabled/
ちなみに、一つ上にihandlers-enabledとかフォルダがあります。
どこに何があるのか全くわからないので、初めはこのサイトさんを参考にしました。文を一部引用させてもらいます。
/opt/dionaea/binaries/
ファイル共有で不正に作成されたファイル.主にマルウェア./opt/dionaea/bistreams/
このディレクトリの下に,さらに日付のディレクトリが作成されます.日付ディレクトリの中に攻撃者からの通信の記録が残ります./opt/dionaea/log/
Dionaea 自体のログです./opt/dionaea/rtp/
SIP のセッションデータが記録されます/opt/dionaea/wwwroot/
Web のドキュメントルートですが,FTP や TFTP のルートディレクトリも兼ねています.なおここに,index.html ファイルを作成しておくと,HTTP 接続時にファイルを指定しなくとも表示されます(例:http://www.example.jp/ のアクセス時に http://www.example.jp/index.html へアクセスしたとみなされる).index.html がない場合はディレクトリリスティングの結果が表示されます.
PowerShell難読化をだた試しながら読む(1) Binary Pulsarさんの記事
ただ下の記事を読んで試すだけ。そのうち忘れて終わりそうな、、笑
PowerShell難読化の基礎 (1) – Binary Pulsar
はじめに
難読化されたコードは実行中に意味あるコードに変わり、コードを評価する関数で実行する。
JavaScriptやPHPなどでは、eval関数。PowerShellの場合はInvoke-Expressionコマンドレットやアンパサンド記号がそれ。
Invoke-Expression
パイプで繋がるよってことと、省略形の"iex"の方が一般的に使われるよってこと。
Invoke-Expressionの難読化
どのマシンでも同じと保証されている環境変数を利用する。COMSPECはcmd.exeまでのパスが入っている。PowerShellは大文字小文字の区別はないらしい。
コードの難読化
アルファベッドをアスキーで表現する。出力は " -Join '. ' "で繋げてあげるとコピペしやすい。
tokyo western ctf 2018 warmup系 復習(若干WriteUp)
たまたま当日見つけてとりあえず参加してみたctfでした。もちろんビギナーズ以降何もしていなかったので、解けるはずもなく、、simpleAuthだけはなんとかって感じで笑
どちらかというと、参加目的はこれから行う復習のためって感じです。他のすごい方のwriteup見て勉強します。
SimpleAuth
問題文には別サイトへ飛ばすURLが貼ってあり、そこには以下のソースコード
<?php require_once 'flag.php'; if (!empty($_SERVER['QUERY_STRING'])) { $query = $_SERVER['QUERY_STRING']; $res = parse_str($query); if (!empty($res['action'])){ $action = $res['action']; } } if ($action === 'auth') { if (!empty($res['user'])) { $user = $res['user']; } if (!empty($res['pass'])) { $pass = $res['pass']; } if (!empty($user) && !empty($pass)) { $hashed_password = hash('md5', $user.$pass); } if (!empty($hashed_password) && $hashed_password === 'c019f6e5cd8aa0bbbcc6e994a54c757e') { echo $flag; } else { echo 'fail :('; } } else { highlight_file(__FILE__); }
僕は最初md5のハッシュを総当たりして、$userと$passを求めるのかと思ってプログラム組んだのですが、、笑 高速なプログラムとか組めなくて、めちゃ時間かかるなぁと思っていたのですが、これ、parse_str()を行うと既存の変数は全部上書きされるというやつでした。
なのでurlの末尾に変更加えます。
http://simpleauth.chal.ctf.westerns.tokyo/?action=auth&hashed_password=c019f6e5cd8aa0bbbcc6e994a54c757e
ちなみに、これ表示の上ではフラグも書き換えられちゃいますね。
mondai.zip
zipのなかに鍵付きのzipが入っていてみたいな、マトリョーシカみたいなやつ。最初のパスワードはファイルの名前通りy0k0s0だったのですが、最初これやっても通らなかったと勘違いして、0の部分が隠されているのかなと謎の思考を展開。0の部分総当たりするプログラム組んでみたら帰ってきたパスワードがy0k0s0..
ここからは他の方のwriteup参照です。。一番下に参考リンク貼りますので、基本的にそちらみた方がわかりやすいです。
次はpcapngファイルの中身を見るらしいです。Dataにa~zの文字列が並んでいて、それぞれ微妙に長さが違います。これらのData長をASCIIで読み直してあげるとパスワードになるそうです。
87 W 101 e 49 1 99 c 111 0 109 m 101 e
すると、次はlist.txtという奴が出てきました。
よはlist.txtのなかにパスワードが入っているよとのことらしい。全部答えみて写してるだけじゃ何にもならないので、ささっとパスワードをリストから総当たりするコードをpythonで作りました。
結果的にパスワードは
eVjbtTpvkU
まだまだ出てきます。
ファイル名がmd5っぽいので以下のサイトで復号できました。
http://www.jp.freemd5.com/sha1-decryption.php#.W4zR94vo3OR
happyhappyhappy
こう書かれたテキストがあったので、最後は上にあげたコードをいじって総当たりするプログラム書きました。(終了処理書いてないから自分で止めてね.なんと無責任な)
パスワードは
to
最後の記述には以下のようあった。
Congratulation! You got my secret! Please replace as follows: (1) = first password (2) = second password (3) = third password ... TWCTF{(2)_(5)_(1)_(4)_(3)}
TWCTF{We1come_to_y0k0s0_happyhappyhappy_eVjbtTpvkU}
scs7
暗号化されたフラグが投げられるので、それを元にフラグを推測する。1回の接続で100回の試行が可能となっており、投げた文字がその暗号化パターンによって暗号化されて帰ってくる。接続をし直すと、暗号パターンは変化するがもう一度100回の試行が可能となる。
文字を適当に打って行くといくつかパターンが見つかる。
・投げた文字によって暗号は影響を受ける
・暗号パターンは一文字前の文字に影響されて変化する
・暗号パターンは文字列全体の長さによって変化する
以上より、ある程度の総当たり攻撃で解読可能になりそう。
・はじめの文字はWTCTF{ 末尾は}
・暗号化されたフラグと暗号文字長を利用して最初の部分が一致する長さを考える。フラグそのものは47文字であることがわかる
・毎回47文字の文字列を生成し、左端から順番に投げられたフラグと一致する文字を探す。
・一度の接続では解けないため、一文字ずつ見つけて行くつもりでプログラムを組む。
・文字を増やしていって、暗号化された文字の一致する長さが前回よりも長いものを正解とする
・トライするたびに複数の候補が上がるが、例のサイトさんの通り、二文字ずつトライすることで回避する
以上を踏まえてとりあえず手動のプログラムをざっと組んでみた。正解の可能性がある二文字列が画面に表示されるので、それの一文字目を正解候補として、flag_find変数に手入力して行く。複数候補がある場合、とりあえず一つを選んで、次のステップに進み、一致長が増えない場合それは不正解として行く
作ってみて、もっといい回答手段がありそうと思い、別のWriteUpを拝見。
暗号文は、メッセージをHexエンコードしたものを59進法に変換したものである。 ただし、59進法で使われる 0-58 をどの記号に割り当てるかは毎回バラバラである。 したがって、はじめに 0-58 がどの記号に対応するか対応表を作ってしまえば、暗号化された FLAG を復号することができる。具体的には chr(59) から chr(117) までを試して、暗号文の最後の桁の文字を見ると、それが 0-58 の数字に対応する。
参考:
TokyoWesterns CTF 4th 2018 Write-up - Qiita
これでわかるんですね。私は多分気づかなかった笑 今度base59のアルゴリズムは組みながら勉強しようかなとは思いました。ちょうど上のサイトさんのコードは参考になりそうですね。後、余談ですが、sendの時に後ろに'¥n'つけるの忘れてたり、つけてもバックスペースじゃなかったから進まなかったりと、色々時間かけちゃったのは反省。毎回これやる。。
dec dec dec
あんまりまだ使い方わかってないgdb-pedaで頑張ろうとしたけど、実行がうまく追えませんでした。WriteUp見てたらradare2というものを使っていたので、入れて見たら、VVモードがとても見やすかったのですが、動的解析をしながらバイナリを追おうとするとどうしても肝心の部分をおってくれない。gdb-pedaと同じ部分が実行される。これどうしたらいいんですかね。初心者に教えてください。
使えれば良いやradare2(静的解析編) - 拾い物のコンパス
とりあえず、流れはつかめました。が、自分の技量だとデバッグできなかったので、今回は諦めます。。勉強して再チャレンジします。
以下はwriteup先より
@25-Q44E233=,>E-M34=,,$LS5VEQ45)M2S-),7-$/3T
がコマンドライン引数と比較される文字ようなので、プログラム内で実行されてる逆順にデコードをかけるようです。自分で解析できなかったので、詳しくは書かないです。。
load
全く手がつかなかったので誰かのWriteUpが上がったらそれみて勉強します。
まとめ
基本がわかってないです。もともとctfの勉強は全くしてないのですが、warm upぐらいはとりあえず解けるようにはなりたいので。。せめて解析ソフトの使い方ぐらいはわかるようにしておきます。次までに!!きっと。
参考サイト(もはやお手本)
hiziriai.hatenablog.com
qiita.com
https://github.com/ccowmu/ctf_2018/tree/master/writeups/TokyoCTF2018/dec-dec-decgithub.com