LoginSignup
1
2

More than 3 years have passed since last update.

3way-handshakeからnmapのステルススキャンを理解する

Posted at

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アドレス

demo

nmapのTCPハーフコネクトスキャン

TCPフルコネクトスキャンに対して、-sSオプションは、TCPハーフコネクトスキャンと呼ばれます。

TCPハーフコネクトスキャンでは、通信が成功しても先ほどの手順③の際に、SYNパケットを送りません

サーバー側から返ってきたパケットがSYN/ACKかRSTかで、ポートが空いているか(通信が可能か)判断するため、サーバー側にログを残さずにその確認が可能となります。

root@kali:~# nmap -sS 対象IPアドレス

demo

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が通信先サーバーとなっています。

demo

このように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

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2