おふとん

IT全般、セキュリティとかCTFとかに偏りがち

IPアドレスの難読化

[環境]

MacOS High Sierra(10.13.4)

[対象]

pingコマンド
curlコマンド
Safari(11.1)を使ったアクセス

[操作]

上記の対象からIPアドレスを使ってコマンド実行、及びアクセスを行う時にどこまで許容されるかを確かめる。
pingping [IPアドレス]
curlcurl http://[IPアドレス]/
Safaricurlで指定したURLをアドレスバーに打ち込んでアクセスを行う。

ここで使うIPアドレス192.168.0.30とする。

[パターン]

1.通常(10進数):192.168.0.30

一般的な指定方法
勿論、全て正確に実行された。

2.10進数(ドット無し):192168030

パターン1から"."を削除
全て11.116.64.94へのアクセスを行なった(後述:パターン9)

$ ping 192168030
PING 192168030 (11.116.64.94): 56 data bytes

3.10進数ドット無し(3バイト調整):192168000030

パターン2の各要素を3バイトになるように調整
pingcurlでは190.26.250.30にアクセスを行った(後述:パターン9)

$ ping 192168000030
PING 192168000030 (190.26.250.30): 56 data bytes

Safariのアクセスの場合は、アドレスが無効と表示

4.2進数:11000000.10101000.0.11110

パターン1の2進数化
全て無効なアドレス、その他2進数を使った表現はどれも通らなかった

5.8進数(4バイト調整):0300.0250.0000.0036

各要素を8進数にして、4バイトになるように0で埋める
pingSafariの場合は正確にアクセスされた
curlの場合も192.168.0.30にはリクエストが飛んでいるがApacheの問題か400となる(Safariの場合は200)

$ curl http://0300.0250.0000.0036/ -verbose
*   Trying 192.168.0.30...
* TCP_NODELAY set
* Connected to 0300.0250.0000.0036 (192.168.0.30) port 80 (#0)
> GET / HTTP/1.1
> Host: 0300.0250.0000.0036
> User-Agent: curl/7.54.0
> Accept: */*
> Referer: rbose
> 
< HTTP/1.1 400 Bad Request
< Date: Mon, 24 Sep 2018 13:40:36 GMT
< Server: Apache/2.4.6 (CentOS) PHP/5.4.16
< Content-Length: 347
< Connection: close
< Content-Type: text/html; charset=iso-8859-1

6.16進数:C0.A8.00.1E

パターン1の要素を単純に16進数化しただけ
全て無効なアドレス

7.16進数(0xあり):0xC0.0xA8.0x00.0x1E

16進数であることを明示的に表すために0xを付ける
挙動はパターン5と同様でcurlでもリクエストは192.168.0.30には飛んでいる

8.16進数(ドット無し):0xC0A8001E

全て正確に実行された。

$ curl http://0xC0A8001E/ -verbose
*   Trying 192.168.0.30...
* TCP_NODELAY set
* Connected to 0xC0A8001E (192.168.0.30) port 80 (#0)
> GET / HTTP/1.1
> Host: 0xC0A8001E
> User-Agent: curl/7.54.0
> Accept: */*
> Referer: rbose
> 
< HTTP/1.1 200 OK
< Date: Mon, 24 Sep 2018 13:53:55 GMT
< Server: Apache/2.4.6 (CentOS) PHP/5.4.16
< Last-Modified: Sun, 23 Sep 2018 21:14:39 GMT
< ETag: "131-576905c5295af"
< Accept-Ranges: bytes
< Content-Length: 305
< Content-Type: text/html; charset=UTF-8

9.10進数(特殊):3232235550

パターン8を1つの16進数の数値と見なして、10進数に再度変換する
結果はパターン5などと同様にしてcurlは400が返ったが正確にアクセスされている
またパターン2,3はこの形式として処理された結果、意図していないIPアドレスにアクセスしたと考えられる

[考察]

Safaricurlの挙動の違いはHostヘッダの値だと思われます
パターン9のhttp://3232235550/にアクセスする際に
curlの場合はHost: 3232235550となっていますが
Safariの場合は192.168.0.30に変換した上でリクエストが送信されていました
f:id:yu_sh38:20180924231357p:plain

400エラーは恐らくHostヘッダーの値を上手くApacheが解釈出来ないのだと思われます
しかし、だとしたらパターン8で成功するのは面白いですね...

これ使って何かをバイパス出来ないかなと思いましたが、送信元IPを偽装出来るだけでもなく
Hostヘッダーを難読化出来るだけなので用途はかなり限られてきそうです

現状では何かしら使えそうな時が来たら見直す、メモ程度_:(´ཀ`」 ∠):