セキュリティ系の勉強・その他開発メモとか雑談. Twitter, ブログカテゴリ一覧
本ブログはあくまでセキュリティに関する情報共有の一環として作成したものであり,公開されているシステム等に許可なく実行するなど、違法な行為を助長するものではありません.

最近読んだ記事やスライドまとめ1

www.atmarkit.co.jp

powershell難読化の際に、ps1ファイルが実行できない問題で閲覧。Windows10ではデフォルトでスクリプトが実行できないように設定されているとのこと。


www.slideshare.net
機械学習でwebアプリケーションの脆弱性診断をしようという話。階層構造になっているページをどう網羅していくかという問題点を挙げ、その時表示される文字からサインインページやエラーページを類推、その結果を用いてページにテストを行う。類推とテストは別々の手法を用いていた。機械学習は全く詳しくはないけれど、やろうとしていることはなんとなく理解できた。


speakerdeck.com

twitterから飛んできた。



speakerdeck.com

上のスライドの自己紹介で登場したWowHoneypotが気になったので調べて出てきたスライド。この人の趣味で作った?みたいなことが書いてあって、どうやら初心者用になっているらしい。攻撃に対して200のレスポンスを返して、実際に攻撃をしてもらう、という流れを自演できる。また、リクエストの内容ごとに、自分でレスポンスをあらかじめ設定できる。実装もpythonで必要最低限といった感じに見えるので、とてもわかりやすそう。目的もはっきりしている。

www.atmarkit.co.jp

実はまだ読みかけだけれど、Metasploitを使ってみようみたいな記事。後から気づいたけど辻さんが書いてた。元々上のスライドで、ハニーポットを作ってそこに実際に攻撃をしてみる部からMetasploitの文字を拾って飛んできた。聞いたことあったけど説明しろと言われたらできなかったので調べた。これは近いうち絶対動かすよ。(予定)

PowerShellの難読化解除 – Binary Pulsar

難読化の記事は半分写しながら追っていったけれど、この記事からは個人で勝手にやって読んでいます。大事なことは、iexや&などをうまく取り除いヤルとともに、それを頼りに全文の形を推測してやること。

www.seohacks.net

dionaeaのログを見ていた時に調べた。クローラの制限をかける場所。

digital-marketing.jp

dionaeaのログを見ていた時に調べた。クローラにサイトマップを教える。

dionaeaのログをちょっと見てみる1

初めに

ログを見たり、知識なんてものもない人がゆっくりとログを見ていくだけです。間違ってることの方が多いかもですが、こういうことで慣れていかないといつまで経っても進まないので、、とりあえずhttpの通信記録を少し見てみる。



1

/opt/dionaea/var/dionaea/bistreams/2018-09-11$ ls | grep "httpd-80-71"
httpd-80-71.6.146.185-gdpfCn
httpd-80-71.6.146.185-SicSdW
httpd-80-71.6.146.185-Tfjw9v
httpd-80-71.6.146.185-v10Uxj
httpd-80-71.6.146.185-xc5qWP

とりあえずこの一連のログを見てみます。

stream = [('in', b'GET /sitemap.xml HTTP/1.1\x0d\x0aHost: 160.16.62.85\x0d\x0aAccept-Encoding: identity\x0d\x0a\x0d\x0a'),
stream = [('in', b'GET /robots.txt HTTP/1.1\x0d\x0aHost: 160.16.62.85\x0d\x0aAccept-Encoding: identity\x0d\x0a\x0d\x0a'),
stream = [('in', b'GET / HTTP/1.1\x0d\x0aAccept-Encoding: identity\x0d\x0aHost: 160.16.62.85\x0d\x0aAccept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\x0d\x0aUser-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36\x0d\x0a\x0d\x0a'),
stream = [('in', b'GET /favicon.ico HTTP/1.1\x0d\x0aHost: 160.16.62.85\x0d\x0aConnection: keep-alive\x0d\x0aAccept-Encoding: gzip, deflate\x0d\x0aAccept: */*\x0d\x0aUser-Agent: python-requests/2.10.0\x0d\x0a\x0d\x0a'),
stream = [('in', b'GET /.well-known/security.txt HTTP/1.1\x0d\x0aHost: 160.16.62.85\x0d\x0aAccept-Encoding: identity\x0d\x0a\x0d\x0a'),

sitemap.xml はクローラへのサイトマップ
robots.txtクローラーのwebアクセスの制限をかけるファイルで、制限したい所のパスを書いたりする。
./well-known/security.txt は脆弱性発見時の通知先を各場所らしい。
https://securitytxt.org


なんか攻撃前の下見をされている感じですかね?きっとこの手のアクセスは今後たくさん見そう。


2

stream = [('in', b'GET /manager/html HTTP/1.1\x0d\x0aContent-Type: text/html\x0d\x0aHost: 160.16.62.85\x0d\x0aAccept: text/html, */*\x0d\x0aUser-Agent: Mozilla/3.0 (compatible; Indy Library)\x0d\x0aAuthorization: Basic Og==\x0d\x0a\x0d\x0a'),

/manager/htmlはTomcatのWebアプリケーションマネージャを使用する際にアクセスする場所。これ以外にも何個か見受けられた。今回、404で弾いちゃっているけれど、正規ではBASIC認証のダイアログが出るらしい。これいい感じに返せてたら、ログインパスワードの攻撃とか受けれそう。

3

stream = [('in', b'OPTIONS /ipc$ HTTP/1.1\x0d\x0aConnection: Keep-Alive\x0d\x0aUser-Agent: Microsoft-WebDAV-MiniRedir/6.1.7601\x0d\x0atranslate: f\x0d\x0aHost: 160.16.62.85\x0d\x0a\x0d\x0a')


/ipc$にアクセスしてる。IPCとは(Inter-Process Communication、プロセス間通信)。

Windowsネットワークにおいて、そのマシンの公開リソースの一覧を取得したり、以後のリソースの使用に対する準備(「SMBのセッション・セットアップ」という。SMBとは、Server Message Blockの略で、Windowsネットワークにおけるファイル共有プロトコルのこと)を行うために使われるものであり、リソース(ファイルやプリンタ)を公開しているマシンは必ずこのリソースを持っている。
http://www.atmarkit.co.jp/fwin2k/win2ktips/117ipcpassword/117ipcpassword.html

とのこと。これもおそらく攻撃前の準備段階なのでしょう。いい感じで返せばそのあとの攻撃も来るんでしょうね。できないけど笑

まとめ

書いてないけどルートのページにアクセスするだけの通信が半分ほどあった。慣れてきたらこういうちまちました調べ方じゃなくて、統計とかまとめた感じで発信できたらなと思う。

【感想】セキュリティのためのログ分析入門-サイバー攻撃の痕跡を見つける技術-

ざっくりした感想

発売して割とすぐ購入した書籍でした。この本は技術評論社発行の雑誌の2015年7月に掲載された特集記事を加筆修正して再編集したもので、入門というだけあって本当に入口の部分に触れている感じなので、専門知識が欲しい方はお勧めできないです。逆に本当に初めての人には知識吸収に良いかも。全体的に調べればウェブ上だけでも拾える知識だなぁとも感じてしまいました。

第一部

ログやセキュリティなどの概念の説明。本当に知らない人向けの説明。

第二部

ログ分析に使用できるツールなどの紹介。調べれば出てくる内容量。

第三部

webサーバのログ内容についての解説や、実際の過去の脆弱性の事例を使用した解説がある。説明もまとまっていてわかりやすいし、とっつきやすいと感じた。ただ、勉強したことがある人なら”代表例しか触れてないな”程度の感想になってしまうかもしれない。私は読む価値があったと思う。

第四部

webサーバ以外のログ、例えばファイアウォールやプロキシのログの見方を解説してくれている。説明も丁寧で、必要になった時はまずこの本を頼りにしようかなと思えた程度の、掴みとまとめかたで読みやすかった。

第五部

アクセスログにあらられない攻撃の検知と防御。システムコールのログをとって攻撃を探す手法等の紹介とそれらに対する実際の事例が紹介されていて、とてもためになる。3章と並んでこの本のメイン的内容。

第六章

ログの自動化に触れたり、ログを別サーバに転送、別サーバでの分析等の、次の一歩に関する手法にさらっと触れる。ログ分析用のシェルスクリプトを最後にいくつか紹介してくれている。全体的に、この後の個人で頑張る人へみたいな内容。



感想

入門者にはとても良い本。何より読みやすいし、説明部分と事例の対応が初心者にも優しく、理解が進む。が、入門という名前の通りの内容。特集記事を再編集したものでもあるため、過度な期待は禁物かなとも感じた。後、サーバをレンタルするか、最低でもローカルに複数マシンを走らせ自分でアクセスするなどしないと、そもそもログを用意できないので、実際に手を動かしたいのであれば、環境づくりは若干手間がかかるかも。

後は、それほど環境依存な内容でもないため、技術書の中では多少月日が経っても読めるかなと感じた。



PowerShell難読化をだた試しながら読む(3) Binary Pulsarさんの記事

元記事はこちらなので皆さんはぜひこちらを読んでください。
PowerShell難読化の基礎 (3) – Binary Pulsar

コメントアウト挿入による難読化

前々回のものにコメントを挿入して難読化を計る

(((102, 111, 114, 101, 97, 99, 104, 40, 36, 105, 32, 105, 110, 32, 40, 49, 46, 46, 53, 41, 41, 123, 32, 87, 114, 105, 116, 101, 45, 72, 111, 115, 116, 32, 36, 105, 125) | %{ ([Int]$_ -as [char]) }) -Join '') | &($env:comspec[4,15,25] -Join '')
(((102, 111, <# #>114, 101, 97, <# ;abcsda #>99, 104, 40, 36, <#coffee#>105, <# caf3tr#D #>32, 105, 110, 32, 40, 49, 46, 46,<# hellorc #> 53, 41, 41, 123, 32, 87, 114, 105, 116, 101, 45, 72, <# 35u89ucad3j0n0 #>111, 115, 116, 32, 36, 105, 125) | %{ ([Int]$_ -as [char]) }) -Join<# TGc #> '') | &($env:comspec<# nuE349999999fasdfa53 #>[4,15,25] -Join '')

当然、意味のある文字列間にコメントを挟むことはできないのであくまで数字と数字の間など、語句の区切りに入れていく感じで。


Base64エンコードによる難読化

JSやPHPと同様にBase64を使用する手法がある。WindowsUnicodeなのでUnicodeのバイト列に変換する必要がある。ここでASCIIのバイト列に直したりすると、実行時にエラーになる

PS > $com = "Get-Date -Format G"
PS > $uniBytes = [System.Text.Encoding]::Unicode.GetBytes($com)
PS > [System.Convert]::ToBase64String($uniBytes)
RwBlAHQALQBEAGEAdABlACAALQBGAG8AcgBtAGEAdAAgAEcA
PS > powershell.exe -enc RwBlAHQALQBEAGEAdABlACAALQBGAG8AcgBtAGEAdAAgAEcA
9/18/2018 23:06:20

スクリプトBase64エンコードでの難読化

.ps1拡張子はpowershellのコマンドが詰まったスクリプトの拡張子らしい。test.ps1を作成して、これを難読化する。基本の流れは変わらない

PS C:\> Get-Content .\test.ps1
$namelist = @("John", "Alex", "Mike")
 
ForEach($name in $namelist)
{
    Write-Host ("Hello, " + $name + "!")
}
PS C:\> .\test.ps1
Hello, John!
Hello, Alex!
Hello, Mike!
PS C:\> $filepath = "C:\test.ps1"
PS C:\> $srctext = [System.IO.File]::ReadAllText($filepath)
PS C:\>
PS C:\> $uniBytes = [System.Text.Encoding]::Unicode.GetBytes($srctext)
PS C:\> [System.Convert]::ToBase64String($uniBytes)
JABuAGEAbQBlAGwAaQBzAHQAIAA9ACAAQAAoACIASgBvAGgAbgAiACwAIAAiAEEAbABlAHgAIgAsACAAIgBNAGkAawBlACIAKQANAAoAIAANAAoARgBvAHIARQBhAGMAaAAoACQAbgBhAG0AZQAgAGkAbgAgACQAbgBhAG0AZQBsAGkAcwB0ACkADQAKAHsADQAKACAAIAAgACAAVwByAGkAdABlAC0ASABvAHMAdAAgACgAIgBIAGUAbABsAG8ALAAgACIAIAArACAAJABuAGEAbQBlACAAKwAgACIAIQAiACkADQAKAH0A
PS C:\> powershell.exe -enc JABuAGEAbQBlAGwAaQBzAHQAIAA9ACAAQAAoACIASgBvAGgAbgAiACwAIAAiAEEAbABlAHgAIgAsACAAIgBNAGkAawBlACIAKQANAAoAIAANAAoARgBvAHIARQBhAGMAaAAoACQAbgBhAG0AZQAgAGkAbgAgACQAbgBhAG0AZQBsAGkAcwB0ACkADQAKAHsADQAKACAAIAAgACAAVwByAGkAdABlAC0ASABvAHMAdAAgACgAIgBIAGUAbABsAG8ALAAgACIAIAArACAAJABuAGEAbQBlACAAKwAgACIAIQAiACkADQAKAH0A
Hello, John!
Hello, Alex!
Hello, Mike!

windows10は初期設定でスクリプトが実行できないようになっているので、以下のコマンド→Yで解除できる。

Set-ExcutionPolicy RemoteSigned

上の逆の手順を踏むことで、エンコードされたスクリプトをデコードできる。メソッドの名前を見れば、逆のことをしているのがよくわかる。

PS C:\> $uniBytes = [System.Convert]::FromBase64String("エンコードされた文字")
PS C:\> [System.Text.Encoding]::Unicode.GetString($uniBytes)

PowerShell難読化をだた試しながら読む(2) Binary Pulsarさんの記事

元記事はこちらなので、皆さんはぜひこちらを読んでください。
PowerShell難読化の基礎 (2) – Binary Pulsar

ドット記号によるスクリプト実行

ドット記号(.)を使用すると、アンパサンド記号(&)と同じ動きをする。

PS /> $comlet = "Get-Host"                                                      
PS /> . $comlet                                                                 


Name             : ConsoleHost
Version          : 6.0.4
InstanceId       : 4c891058-e3d5-48ec-ae4e-0e84674d999e
UI               : System.Management.Automation.Internal.Host.InternalHostUserI
                   nterface
CurrentCulture   : ja-JP
CurrentUICulture : ja-JP
PrivateData      : Microsoft.PowerShell.ConsoleHost+ConsoleColorProxy
DebuggerEnabled  : True
IsRunspacePushed : False
Runspace         : System.Management.Automation.Runspaces.LocalRunspace



PS /> 
<br>
<br>
<br>

コマンドレット実行結果を利用

PowerShellの難読化では、意図的に一つしか結果が返ってこないコマンドレットを実行することにより、難読化に必要な文字列を取得するという手法がある。Get-commandは文字長が長く可読性があるので、エイリアスの"gcm"を使用すると良い。

PS> Get-command "*ke-E*"                                                      
CommandType     Name                                               Version    S
                                                                              o
                                                                              u
                                                                              r
                                                                              c
                                                                              e
-----------     ----                                               -------    -
Cmdlet          Invoke-Expression                                  3.1.0.0    M



PS /> .(gcm "*ke-E*") $comlet                                                   
Name             : ConsoleHost
Version          : 6.0.4
InstanceId       : 4c891058-e3d5-48ec-ae4e-0e84674d999e
UI               : System.Management.Automation.Internal.Host.InternalHostUserI
                   nterface
CurrentCulture   : ja-JP
CurrentUICulture : ja-JP
PrivateData      : Microsoft.PowerShell.ConsoleHost+ConsoleColorProxy
DebuggerEnabled  : True
IsRunspacePushed : False
Runspace         : System.Management.Automation.Runspaces.LocalRunspace

文字列"iex"の取得

前回の文字列から文字を抽出するやり方を同時に使用することが可能。Get-VariableはPowerShellで定義された変数を取得するためのコマンドレットで、gvにエイリアスされる。お手本ではMaximumDriveCountであったが、私のPowerShellMacOS上で走らせているためか、MaximumHistoryCountしか存在しなかった。ので、ExecutionContextで代用。

PS /> $comlet = "Get-Host"                                                      
PS /> gv "*onCont*"                                                             

Name                           Value                                           
----                           -----                                           
ExecutionContext               System.Management.Automation.EngineIntrinsics   


PS /> (gv "*onCont*" | %{$_.Name})[6,13,14] -Join ''                            
iex
PS /> .((gv "*onCont*" | %{$_.Name})[6,13,14] -Join '') $comlet                 


Name             : ConsoleHost
Version          : 6.0.4
InstanceId       : 4c891058-e3d5-48ec-ae4e-0e84674d999e
UI               : System.Management.Automation.Internal.Host.InternalHostUserI
                   nterface
CurrentCulture   : ja-JP
CurrentUICulture : ja-JP
PrivateData      : Microsoft.PowerShell.ConsoleHost+ConsoleColorProxy
DebuggerEnabled  : True
IsRunspacePushed : False
Runspace         : System.Management.Automation.Runspaces.LocalRunspace



PS /> 

評価されない文字

挿入しても評価されない文字があるため、難読化に使用できる。バッククオート記号は、以下のエスケープシーケンスに一致しなければ、挿入しても文字列に影響を及ぼさない。

`0 NULL
`a 警告音
`b バックスペース
`f フォームフィード
`n 改行
`r キャリッジリターン
`t 水平タブ
`v 垂直タブ
http://binary-pulsar.azurewebsites.net/2018/09/08/ps-obfuscate-pt2/

よって、文字列自体を難読化させることが可能。(お手本では'e'の前にもバッククオートを挿入できていたが、私の環境ではできなかった。eの後ろのtが消えてしまう。"`ea"とやると、aの文字が消える。) 恐らくWindows環境なら可能なはず。

PS /> "`Get-`H`o`st" | iex                                                      


Name             : ConsoleHost
Version          : 6.0.4
InstanceId       : 4c891058-e3d5-48ec-ae4e-0e84674d999e
UI               : System.Management.Automation.Internal.Host.InternalHostUserI
                   nterface
CurrentCulture   : ja-JP
CurrentUICulture : ja-JP
PrivateData      : Microsoft.PowerShell.ConsoleHost+ConsoleColorProxy
DebuggerEnabled  : True
IsRunspacePushed : False
Runspace         : System.Management.Automation.Runspaces.LocalRunspace



PS />