3way-handshakeとnmapステルススキャン
以前の記事でpWnOS:2.0という脆弱性サーバーに、Kali Linuxを使ってroot権限を取得しました。
そのKali Linuxでポートスキャンを行うに使ったnmapというツールは、対象サーバーにログを残さないステルススキャンを行うことができました。
今回はこのnmapのステルススキャンを実現している、TCPプロトコルの3way-handshakeについてまとめていきたいと思います。
3way-handshakeとは?
3way-handshakeとは通信の信頼性を確保するための接続で、TCPヘッダ情報のフラグを利用した通信方法です。
この3way-handshakeが終了したことでTCPコネクションが確立したということを示し、上位レイヤーでHTTP通信などが行われます。
3way-handshakeを実現するTCPコネクション
次に、3way-handshakeを実現するTCPコネクションについてまとめていきます。
そもそもTCPはヘッダに、6つのフラグ情報というものを持っています。
そして、各フラグにはTCPコネクションを行うためのフラグ情報が1ビット(0か1)で管理されています。
3way-handshakeでは6つのフラグのうち、通信を確立するためのSYN(Synchronize)フラグ、通信可能を確認できたことを示すACK(Acknowledge)フラグ、通信を強制的に切断するRST(Reset)フラグが使われています。
クライアントサーバー間のパケットで、このフラグを設定することで通信が可能か、通信が不可能かということを判断するのです。
具体的に通信手順は、以下のようになります。
※パケット(TCPセグメント)とは、TCPのヘッダとTCPペイロード(データ)から構成される。
※シーケンス番号とはTCPヘッダに記載されている、パケットにつけられる通し番号のことである。
3way-handshakeの通信例
①クライアント側は、シーケンス番号が10000、SYNフラグが1のSYNパケットをサーバー側に送る。
②サーバー側は通信可能な場合、ACKフラグを1、シーケンス番号を送られてきたSYNパケットに1を足10001にした、ACKパケットをクライアント側に返す。
またクライアント側からどのシーケンス番号を起点とし通信するか決めるため、新たにシーケンス番号30000のSYNパケットをクライアント側に返す。
③クライアント側は送られてきたSYNパケットのシーケンス番号に1を足した30001に設定し、ACKパケットをサーバー側に返すことで通信が確立される。(このSYNパケットはサーバの対する応答の意味しかないので、SYNフラグは0に設定されている)
通信が不可能な時は②でRSTフラグが1のパケットが返ってくるので、通信が強制終了されます。
nmapのTCPフルコネクトスキャン
ここで、3way-handshakeを使ったnmapの通信方法について紹介したいと思います。
nmapではスキャンタイプを**-sT**とすることで、TCPフルコネクトスキャンが可能になります。
このTCPフルコネクトスキャンが、先ほど説明した3way-handshakeのTCPコネクションが実践されている接続方法になります。
root@kali:~# nmap -sT 対象IPアドレス
nmapのTCPハーフコネクトスキャン
TCPフルコネクトスキャンに対して、-sSオプションは、TCPハーフコネクトスキャンと呼ばれます。
TCPハーフコネクトスキャンでは、通信が成功しても先ほどの手順③の際に、SYNパケットを送りません。
サーバー側から返ってきたパケットがSYN/ACKかRSTかで、ポートが空いているか(通信が可能か)判断するため、サーバー側にログを残さずにその確認が可能となります。
root@kali:~# nmap -sS 対象IPアドレス
Wiresharkで3way-handshakeを確認
実際にWiresharkという、パケットの流れをみれるKali Linuxのツールを使って、nmapによる3way-handshakeがどのような通信になっているか確認します。
ここではpWnOS:2.0で設定したIPアドレスと同じで、クライアント側のIPが10.10.10.10、サーバー側のIPが10.10.10.100に設定されています。
まずKali Linuxを開いて、wiresharkコマンドを打ちます。
root@kali:~# wireshark
無事Wiresharkが立ち上がりeth0を選択します。
次に別のタブでターミナルを開き、nmapコマンドでポート80番に対しステルススキャンを行います。
root@kali:~# nmap -sS -p 80 10.10.10.100
nmapコマンドを打ったら、パケットの情報がでてきているのでWIRESHARKを開きます。
Sourceが通信元サーバー、Destinationが通信先サーバーとなっています。
このようにNo12でクライアント側からサーバー側にSYNパケットを送り、No13でサーバー側からSYN/ACKパケットが返ってきて、No13でRSTパケットにより接続を終了していることがわかります。
このようにWiresharkを使うことで、nmapを使った3way-handshakeのTCP通信の流れを見ることができました、
参考URL
https://resources.infosecinstitute.com/nmap/#gref
https://www.atmarkit.co.jp/ait/articles/0801/08/news127_2.html
http://www.yk.rim.or.jp/~shikap/security/vul_text/attack1.html
http://www.yk.rim.or.jp/~shikap/security/vul_text/TCPIP1.html
http://www.yk.rim.or.jp/~shikap/security/vul_text/TCPIP2.html
http://www.yk.rim.or.jp/~shikap/security/use_nmap.html
https://ascii.jp/elem/000/000/619/619702/
https://milestone-of-se.nesuke.com/nw-basic/tcp-udp/tcp-connection/
https://qiita.com/55momotara55/items/2081312e1dd14521c0a1
https://www.infraexpert.com/study/tcpip8.html