CTF Network¶
- CTF Network
- Command gadgets
- Cheat Sheets
- パケットのヘッダ構造
- Ether - IP - TCP/UDP 以外の通信プロトコル
- USBの通信プロトコル
- Misc
Command gadgets¶
ncat¶
nc ホスト名 ポート番号
eオプションを使うために、ソースからコンパイルする¶
eオプション:nc の標準入出力を、 指定したコマンドにリダイレクトするためのオプション
make 時に「DGAPING_SECURITY_HOLE」を指定しないと -e オプションが使えないという情報を見かけるけど、不要っぽい。
公式サイトからダウンロードした後
# 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スクリプト¶
以下は、サーバからもらった計算式を計算して、送り返している例
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スクリプト(別解)¶
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スクリプト(雛形)¶
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を使うと方程式も解ける実例
HTTP通信 GET するPythonスクリプト¶
import urllib
s = urllib.urlopen('http://www.yahoo.co.jp/')
html = s.read()
s.close()
print html
HTTP通信 POST するPythonスクリプト¶
import urllib, urllib2
data = urllib.urlencode({'name': 'admin', 'password': 'H4ck3r'})
s = urllib2.urlopen('http://www.../login', data)
html = s.read()
print html
外部コマンド実行 する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スクリプト¶
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/
Wireshark チートシート part1 pic.twitter.com/obIJ16Cu8N
— いちごろ@🐸 (@panda66104256) April 18 2020
Patr2 pic.twitter.com/KTWXssdG8K
— いちごろ@🐸 (@panda66104256) April 18 2020
パケットのヘッダ構造¶
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
よっちんのブログ - 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/