CTF Network » 履歴 » リビジョン 2
リビジョン 1 (kanata, 2025/04/13 14:23) → リビジョン 2/3 (kanata, 2025/05/10 09:23)
# CTF Network {{last_updated_at}} {{>toc}} {{toc}} # Command gadgets ## ncat ``` nc ホスト名 ポート番号 ``` ### eオプションを使うために、ソースからコンパイルする eオプション:nc の標準入出力を、 指定したコマンドにリダイレクトするためのオプション make 時に「DGAPING_SECURITY_HOLE」を指定しないと -e オプションが使えないという情報を見かけるけど、不要っぽい。 [公式サイト](http://netcat.sourceforge.net/)からダウンロードした後 ``` # tar zxvf netcat-0.7.1.tar.gz # cd netcat-0.7.1 # ./configure --prefix=/usr/local # make ``` 動作確認(サーバ側) ``` # cd src # ./netcat -l -p 1234 -e /bin/sh ``` 動作確認(クライアント側) ``` # ./netcat localhost 1234 ``` ### ncコマンドでTCP proxyを動かしながら記録する 名前付きパイプを作る必要がある ``` $ mkfifo hoge $ /usr/bin/nc -l 127.0.0.1 5555 < hoge | tee -a in | /usr/bin/nc example.com 80 | tee -a out > hoge ``` ### sslを利用する SSLで通信を行わせる場合は、サーバ・クライアントともに「–ssl」オプションを付与する必要がある点に注意。 サーバ側 ``` $ nc -vl [ポート番号] --ssl ``` クライアント側 ``` $ nc -v [対象ホスト] [ポート番号] --ssl ``` ### webサーバへhttp-getリクエストを行う ``` $ echo -en "GET / HTTP/1.1\n\n" | nc [対象ホスト] 80 ``` ### ファイルを転送する サーバ側からクライアント側にファイルを取得させる場合 ``` $ nc -l ポート番号 < 転送するファイルPATH # サーバ側 $ nc 対象ホスト ポート番号 > 転送されたファイルを取得するPATH # クライアント側 ``` クライアント側からサーバ側にファイルを取得させる場合 ``` $ nc -l ポート番号 > 取得したファイルの保持先PATH # サーバ側 $ nc 対象ホスト ポート番号 < 転送するファイルPATH # クライアント側 ``` ### ポート範囲を指定してスキャンを行う ``` $ nc -vz 対象ホスト ポート番号-ポート番号 ``` ## nmap ``` nmap 192.168.1.1 nmap -sU 192.168.1.1 nmap -A 192.168.1.1 ``` ### IPv4ホストを探索する -nはDNS逆引きの無効化、-snはポートスキャンしない。 ``` # nmap -n -sn 192.168.0.0/24 ``` ### LAN内のIPv6ホストを探索する LAN内の全ホストを表すマルチキャストアドレスff02::1にICMP pingを送る。 -vは詳細表示。 ``` # nmap -v -n -sn --script targets-ipv6-multicast-echo ``` ### 特定のホストをポートスキャンする -sSVCはSYN scanの指定とバージョン情報の調査と標準NSEスクリプトの実行、-OはOS推測、-p-は0から65535までの全ポートをスキャン、-T4はスキャン速度を上げる。 ``` # nmap -v -sSVC -O -p- -T4 localhost ``` ### HTTPサーバ上のファイルを探索する /robots.txtや/phpmyadmin/などのよく知られたパスを探索する。 ``` # nmap -v --script http-enum localhost -p 80 ``` ### サブドメインを辞書攻撃で探索する www以外のサブドメインを辞書攻撃で探索する。 ``` # nmap -v --script dns-brute www.example.com ``` ### IPアドレスの所有者を調べる IPアドレスが割り当てられている組織を表示する。 ``` # nmap -v --script whois-ip www.example.com ``` ### 同一IPアドレスを持つ他のドメインを調べる オンラインデータベースにアクセスし、同じIPアドレスに向けられた他のドメインを調べる。 ``` # nmap -v --script hostmap-bfk www.example.com ``` ## snmpget snmpget -v 1 -c コミュニティ名 ホスト OID... ``` snmpget -v 1 -c public localhost system.sysUptime.0 system.sysName.0 ``` ## tshark tsharkは通信の状態をGUIで解析することのできるWiresharkのCUI版です。 「-D」オプションでインターフェイスを調べる ``` # tshark -D ``` キャプチャする(-i 1 はインタフェース確認した際に表示されたeth0に対応した番号) ``` # tshark -i 1 -w packet.pcap # tshark -i 1 -f 'host 101.111.73.127' -w packet.pcap # tshark -i 1 -f 'port 53' -w packet.pcap # tshark -i 1 -f 'port 80 and tcp' -w packet.pcap # tshark -i 1 -f 'host www.example.com and not port 80' -w packet.pcap ``` 細かく出すには-V ``` # tshark -i 1 -V -f 'port 53' ``` パケットダンプは-x ``` # tshark -i 1 -x -f 'port 53' ``` 読み込みは-r ``` # tshark -r packet.pcap ``` 出力形式を細かく指定できるけど、そんなことするよりかは、普通にWireshark使った方がいいと思う。 http://assimane.blog.so-net.ne.jp/2011-01-08 ふるつき - tsharkメモ https://furutsuki.hatenablog.com/entry/2016/02/23/155655 ## tcpdump A tcpdump Primer with Examples https://danielmiessler.com/study/tcpdump/#examples ## 証明書を取得するワンライナー ``` echo Q | openssl s_client -connect raintrees.net:443 |openssl x509 -text ``` ## サーバと連続でやりとりするシェルスクリプト 以下は、サーバからもらった計算式を計算して、送り返している例 ``` #!/bin/sh exec 5<>/dev/tcp/[host]/[port] for I in {1..101} do cat 0<&5>test.txt & sleep 1 pkill cat WORD=`cat test.txt|tail -1|sed 's/=//g'` ANSWER=`ecgo ${WORD}|bc` echo ${ANSWER} > &5 echo Debug [${I}] ${WORD} '=' ${ANSWER} done exit 0 ``` > 余談だが、これ系の問題で、数値がローマ数字だったり漢数字だったりするパターンがある > numconvコマンドを使うと一発で変換してくれる ## サーバと連続でやりとりするPythonスクリプト 以下は、サーバからもらった計算式を計算して、送り返している例 ```python import socket sock=socket.socket(socket.AF_INET,socket.SOCKET_STREAM) sock.connect(('[host]',[port])) for num in range(100): content=sock.recv(10240) if len(content) == 0: break print content if '=' in content: func = content.split('=')[0] answer = eval(func) print answer s.send(str(answer)+'\n') ``` ## サーバと連続でやりとりするPythonスクリプト(別解) ```python import socket server='192.168.100.100',12345 s=socket.socket() s.connect(server) for i in range(100) exp = recv(1024) print exp, ans=eval(exp.split('\n')[1][:-1]) print ans s.send(str(ans)+'\n') print s.recv(1024) ``` ## サーバと連続でやりとりするPythonスクリプト(雛形) ```python import socket def solve(data): 解法処理を書く return '処理結果 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect(('123.45.67.89', 12345)) #ホスト名とポート番号 for i in range(100): s.send(solve(s.recv(1024))) #読んで説いて返答 print s.recv(1024) #フラグ表示 ``` > 余談だが、SymPyを使うと方程式も解ける[実例](https://gist.github.com/jellyfish26/f13dd67ee979eb6c3ccd50deba6b03df) ## HTTP通信 GET するPythonスクリプト ```python import urllib s = urllib.urlopen('http://www.yahoo.co.jp/') html = s.read() s.close() print html ``` ## HTTP通信 POST するPythonスクリプト ```python import urllib, urllib2 data = urllib.urlencode({'name': 'admin', 'password': 'H4ck3r'}) s = urllib2.urlopen('http://www.../login', data) html = s.read() print html ``` ## 外部コマンド実行 するPythonスクリプト ```python import subprocess p = subprocess.Popen(['cat', '-'], stdin = subprocess.PIPE, stdout = subprocess.PIPE, stderr = subprocess.STDOUT) p.stdin.write('Hello¥n') print p.stdout.readline() ``` ## ファイル入出力 するPythonスクリプト ```python src = open('/tmp/a', 'r') dst = open('/tmp/b', 'w') for line in src: dst.write('# ' + line) src.close() dst.close() data = open('/tmp/data', 'rb').read() print data ``` ## 10分置きにローテーションと圧縮しながらパケットキャプチャする ``` # tcpdump -i eth0 "port 53" -w dnsclient-%F-%T.pcap -G 600 -z gzip -Z test_user & ``` オプション ``` -G rotate_seconds -i interface -w file -z postrotate-command -Z user ``` # Cheat Sheets ネットワーク関係チートシート http://packetlife.net/library/cheat-sheets/ {{rawhtml(<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">Wireshark チートシート part1 <a href="https://t.co/obIJ16Cu8N">pic.twitter.com/obIJ16Cu8N</a></p>— いちごろ@🐸 (@panda66104256) <a href="https://twitter.com/panda66104256/status/1251311853168295937?ref_src=twsrc%5Etfw">April 18 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>)}} {{rawhtml(<blockquote class="twitter-tweet"><p lang="lt" dir="ltr">Patr2 <a href="https://t.co/KTWXssdG8K">pic.twitter.com/KTWXssdG8K</a></p>— いちごろ@🐸 (@panda66104256) <a href="https://twitter.com/panda66104256/status/1251313846079250432?ref_src=twsrc%5Etfw">April 18 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>)}} # パケットのヘッダ構造 http://ruffnex.oc.to/kenji/xrea/ipv4.txt http://ruffnex.oc.to/kenji/xrea/checksum.txt http://ruffnex.oc.to/kenji/xrea/udp_spoof.txt http://ruffnex.oc.to/kenji/xrea/icmp.txt http://ruffnex.oc.to/kenji/xrea/syn.txt Ethernetヘッダ http://j-net21.smrj.go.jp/develop/digital/entry/002-20081031-02.html | 項目 | 長さ | |---------------------------|---------------------------------| |あて先MACアドレスフィールド|6バイト(48ビット) ↔16進数で12桁 | |送信元MACアドレスフィールド|6バイト(48ビット) ↔16進数で12桁 | |タイプフィールド |2バイト(16ビット) ↔16進数で 4桁 | タイプ - 0x0800 IP - 0x0806 ARP - 0x8035 RARP - 0x8191 NetBIOS/NetBEUI - 0x86DD IP6 - 0x8863 PPPoE Discovery stage - 0x8664 PPPoE Session stage IPヘッダ http://atnetwork.info/tcpip/tcpip83.html ``` 0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |Version| IHL |Type of Service| Total Length | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Identification |Flags| Fragment Offset | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Time to Live | Protocol | Header Checksum | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Source Address | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Destination Address | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Options | Padding | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ ( RFC 791 より ) ``` | 項目 | 意味 | |-------------------|---------------------------------------------------------------------| | Version | バージョン。通常は IPv4 なので 4 だ。IPv6 の場合は 6 が設定される。 | | IHL(Internet Header Length) | 32bits を 1 としてIPヘッダの長さを表す。この値によりパケットの中のどこからがデータなのかを計算する。| | Type of Service(TOS) | 通信が混雑した場合のデータの優先順位を決める。あまり使われていないらしい。 | | Total Length | IPヘッダとデータの合計の長さをバイト単位で表す。| | Identification | IPがデータを分割したときに、もともと同じデータであったことを示すための識別子。| | Flags | IPパケットの分割に関する情報を格納。 | | Flagment Offset | データを分割した際にこのデータが全体のどの位置にいるかを示す。 | | Time to Live(TTL) | データの寿命を表す。ルータを通るたびにこの値が 1 づつ減らされ 0 になると破棄される。| | Protocol | 上位プロトコルが何か?を格納するフィールド。Linux や Unix なら /etc/protocols ファイルに対応番号が書かれてある。 | | Header Checksum | IPヘッダが壊れていないかどうかを判断するチェックサムフィールド。 | | Source Address | データの送り元のIPアドレス | | Destination Address | データの送り先(宛先)のIPアドレス | | Options | 可変長のオプションフィールド。あまり使用しない。 | | Padding | IPヘッダは 32bits の整数倍である必要があるのでそのための穴埋めフィールド。 | TCPヘッダ http://atnetwork.info/tcpip/tcpip29.html ``` 0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Source Port | Destination Port | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Sequence Number | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Acknowledgment Number | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Data | |U|A|P|R|S|F| | | Offset| Reserved |R|C|S|S|Y|I| Window | | | |G|K|H|T|N|N| | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Checksum | Urgent Pointer | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Options | Padding | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | data | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ TCP Header Format ( RFC 793 より ) ``` | 項目 | 意味 | |------------------|----------------------------| | Source Port | 送信元が使用するポート番号 | | Destination Port | 送信先(宛先)のポート番号 | | Sequence Number | シーケンス制御の行うために使用するシーケンス番号。3 way handshake による通信の確立を行うときに使用する。 | | Acknowledgment Number | 再送制御を行うために使用するACK番号。 | | Data Offset | TCPヘッダの長さを4bytes(32bits)単位で表したもの。 | | Reserved | 予約フィールドと呼ばれる場所。Flags が今後増えたときにも対応できるようにしたものだと思う。実質、意味は無し。 | | Flags(URG,ACK,PSH,RST,SYN,FIN) | メッセージの種別を表すフラグの格納する場所。| ||URG: 現在は使われていない。 | ||ACK: 応答確認パケットであることを示す。コネクション開設時に使用される。 | ||PSH: バッファリングするかどうかの判定。1,受信後バッファリングしない。0,バッファリングできる。| ||RST: コネクションを強制的にリセットする。強制切断。| ||SYN: 接続要求パケットであることを示す。其以外は 0 である。| ||FIN: パケットが切断要求パケットであることを示す。其以外は 0 である。| | Window | Window制御で使用するサイズを格納する。 | | Checksum | TCPデータが壊れていないかを判断するチェックサムフィールド。IPヘッダとは異なり擬似ヘッダを使用する。 | | Urgent Pointer | TCP Flags の URG が 1 になっている場合に使用されるらしいがURG 自体あまり使われてないのでよくわからない。 | UDPヘッダ http://atnetwork.info/tcpip/tcpip30.html ``` 0 7 8 15 16 23 24 31 +--------+--------+--------+--------+ | Source | Destination | | Port | Port | +--------+--------+--------+--------+ | | | | Length | Checksum | +--------+--------+--------+--------+ | | | data | +-----------------------------------+ UDP Header Format ( RFC 768 より ) ``` | 項目 | 意味 | |------------------|------------------------------------| | Source Port | 送信元が使用するポート番号 | | Destination Port | 送信先(宛先)のポート番号 | | Length | UDPヘッダを含めたUDPデータの長さ。 | | Checksum | チェックサムフィールド | # Ether - IP - TCP/UDP 以外の通信プロトコル ## gdb(remort) なんかSECCONの問題にあった気がする ## USB - KeyBorad [http://www.usb.org/developers/hidpage/Hut1_12v2.pdf](http://www.usb.org/developers/hidpage/Hut1_12v2.pdf) よっちんのブログ - HackIT CTF 2017 Writeup - USB ducker (Foren 100) http://yocchin.hatenablog.com/entry/2017/09/01/222100 # USBの通信プロトコル N->N->N - USB HID 1.11 を読む http://d.hatena.ne.jp/hanya_orz/20140425/p1 USBキーボードのキーコード http://www2d.biglobe.ne.jp/~msyk/keyboard/layout/usbkeycode.html # Misc KEIROMICHI - IPアドレスから住所を検索できます。 http://i.penguinweb.net/ 坂井さんの簡易パケット操作ツール群(pkttools) http://kozos.jp/software/pkttools.html パケットエディタ(pcapも見れるよ!) https://wireedit.com/ Ostinato: パケット作成ツール。GUIで使いやすくて、負担テスト、パケット解析の勉強など http://ostinato.org/ labunix's blog - MACアドレスのOUIをローカルで調べるコマンドを作ってみる。 http://labunix.hateblo.jp/entry/20190805/1565009988 CURRYFINGER - SNI & Host header spoofing utility https://dualuse.io/blog/curryfinger/ >CDNの後ろにあるサーバを割り出すためのツール >同様のツールにCloudFlairがある PacketProxy https://github.com/DeNA/PacketProxy >HTTP/HTTPS通信だけでなく、より低レイヤーのTCP/UDPを利用したバイナリ通信にも対応した、オープンソースのローカルプロキシツール The Ultimate PCAP https://weberblog.net/the-ultimate-pcap/ >いろんなプロトコルのpcapサンプル パケットキャプチャで理解する TLS1.3 https://zenn.dev/arailly/books/41061020f0cfaa 東陽テクニカ > 情報通信 > エンジニアノート https://www.toyo.co.jp/ict/contents/detail/engineernote.html ## Wiresharks Wireshark によるパケット解析講座 1: Wiresharkの表示列をカスタマイズする https://unit42.paloaltonetworks.jp/unit42-customizing-wireshark-changing-column-display/ Wireshark によるパケット解析講座 2: 脅威インテリジェンス調査に役立つフィルタリング設定 https://unit42.paloaltonetworks.jp/using-wireshark-display-filter-expressions/ Wireshark によるパケット解析講座 3: ホストとユーザーを特定する https://unit42.paloaltonetworks.jp/using-wireshark-identifying-hosts-and-users/ Wireshark によるパケット解析講座 4: Pcapからのオブジェクトのエクスポート https://unit42.paloaltonetworks.jp/using-wireshark-exporting-objects-from-a-pcap/ Wireshark によるパケット解析講座 5: Trickbot感染の調査 https://unit42.paloaltonetworks.jp/wireshark-tutorial-examining-trickbot-infections/ Wireshark によるパケット解析講座 6: Ursnif感染の調査 https://unit42.paloaltonetworks.jp/wireshark-tutorial-examining-ursnif-infections/ Wireshark によるパケット解析講座 7: Qakbot感染の調査 https://unit42.paloaltonetworks.jp/tutorial-qakbot-infection/ Wireshark によるパケット解析講座 8: HTTPSトラフィックの復号 https://unit42.paloaltonetworks.jp/wireshark-tutorial-decrypting-https-traffic/ Wireshark によるパケット解析講座 9: Dridex感染トラフィックの調査 https://unit42.paloaltonetworks.jp/wireshark-tutorial-dridex-infection-traffic/ Wireshark によるパケット解析講座 10: Emotet 感染トラフィックの調査 https://unit42.paloaltonetworks.com/wireshark-tutorial-emotet-infection/ Wireshark によるパケット解析講座 11: RDPトラフィックの復号 https://unit42.paloaltonetworks.jp/wireshark-tutorial-decrypting-rdp-traffic/