CTF Network

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/

パケットのヘッダ構造

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/

Add picture from clipboard (Maximum size: 100 MB)