タマです。
先日、山梨に行きました。 たまご村で、こだわりたまごに出会いました。
こどもたちは、すべすべたまごと喜んでいました。ふむふむと🥚をながめていると、なんだか0に見えてきました。
おもむろに Windows を取り出し、ブラウザでポート🥚を開いてみました。
「ERR_ADDRESS_INVALID」
はじめてみました。アドレスが無効とのことです。
ブラウザは例外に弱そうなので、エソジニア御用達のcurl
に頼りました。
> curl -4 -v localhost:0
* Immediate connect fail for 127.0.0.1: Address not available
curl: (7) Couldn't connect to server
あ、あのcurl
様でさえもAddress not available
!?
ついにLinuxを取り出しました。
$ nc 127.0.0.1 0
Error: Invalid port specification: 0
震えました。すべすべたまごとか言って、かわいげ演出しておきながら、ポート🥚は全くフレンドリではなかったのです。
少しこの状況に戸惑った後、これを逆手にとって 🥚ポートで通信するクライアントとサーバをなんとか準備できると、 おいそれとはアクセスできない業務アプリが作れるのではと妄想を抱きました。
そうです、うまくいけば攻撃者フリーの世界です!
ここで重大なミスに気づきました。
ペンテスターの嗜み。nmap
での確認を忘れていたのです。
$ nmap -Pn -n -p0 --packet-trace 127.0.0.1
Starting Nmap 7.93 ( https://nmap.org )
CONN (0.0197s) TCP localhost > 127.0.0.1:0 => Operation now in progress
CONN (0.0197s) TCP localhost > 127.0.0.1:0 => Connection refused
Nmap scan report for localhost (127.0.0.1)
Host is up (0.000076s latency).
PORT STATE SERVICE
0/tcp closed unknown
Nmap done: 1 IP address (1 host up) scanned in 0.02 seconds
唇を噛み締めました。ポート🥚にしっかり通信できています。さすがnmapです。これではスキャン族にすぐ見つかってしまう。
もうボツネタまっしぐらです。なんかの殻に閉じこもりたいです。
少しの深呼吸の後、そもそも普段スキャンされてるのかなとググりはじめます。
あれ。nmapのスキャン例が。 -p1-65535
になってるやないかい!!
もしかして。テキトーにフルスキャンの手引きを見た程度のスキャン族はポート🥚を対象から除外してるのではあるまいか!
希望が生まれました。
あ。あの伝説のハッカージャパンですら。プスーッ。
しかも。あの shodan や
censys さえも、🥚のことを関知していない!
いける。ポート🥚でサービス作ったらセキュア。すぐに適当なサーバの立ち上げを試みます。
nc -l -p 0
Error: Invalid local port: 0
あ。待受けできない。プログラミングしてみます。
$ cat > tama.go // 🥚
package main
import (
"fmt"
"net"
)
func main() {
s, _ := net.Listen("tcp", "127.0.0.1:49151")
fmt.Println(s.Addr())
s, _ = net.Listen("tcp", "127.0.0.1:0") // 🥚
fmt.Println(s.Addr())
}
$ go run -exec sudo .
127.0.0.1:49151
127.0.0.1:46081 < 🥚 ではない!
🥚を使ったつもりが46081
ポートでバインドしちゃってます。
そういえば🥚で待受け指示すると空きポートを勝手に選ぶ挙動するんでした。完全に忘れてました。
inet_csk_get_port
とかいうカーネルの何かの近辺をどうにかするといいかもしれませんが、職業ハッカーのタマはタチあがれません。
netfilter でお茶を濁します。
iptables -t nat -A PREROUTING -p tcp --dport 0 -j REDIRECT --to 8181
iptables -t nat -A PREROUTING -p udp --dport 0 -j REDIRECT --to 8181
これで受信した🥚ポート宛通信は8181にリダイレクトされます。
あとはサーバ側で好きにサービスを8181で立ち上げ、クライアント側では宛先に🥚を指定してあげます。 とりあえずLinuxではcurlでも🥚にアクセスできちゃったし、WireGuardクライアント的な設定に🥚したらVPNが確立できました。よし。
一段落です。
そういえば仕様やら、あるいは設定忘れでファイアウォールが🥚に関知しないケースもあるようです。
もしかしたら、フィルタを忘れたり未定義の動作を利用して🥚ポートからファイル持ち出し。あるいはC2とチャネル確立を許してしまう。なんてことがあるかもしれません。ハッカーフレンドリですね。
みなさまもポート🥚で業務サイトの公開を検討されてはいかがでしょうか。 仲間たちはきっと超人のみがアクセスできる、エッグい環境におののくこと請け合いです。