KaliLinuxでIDA-Demoを使う
環境
- Linux version 4.6.0-kali1-amd64
おそらくDebian系ならこれでできると思う
IDA Demo 6.95 for Linuxをダウンロードする
$ mkdir temp $ cd temp $ wget https://out7.hex-rays.com/files/idademo695_linux.tgz $ tar xvzf idademo695_linux.tgz $ cd idademo695
ソースではなく実行形式が含まれているので
$ ./idaq
で実行できるがこのKaliLinuxのバージョンではライブラリ等が足りないので
$ ./idaq bash: ./idaq: そのようなファイルやディレクトリはありません
となる。
本記事はこれを実行できるように試行錯誤したものなので、
結果だけ知りたいという人は最後のコマンドを実行してください
前準備
$ apt update $ apt upgrade
ライブラリのインストール
IDA-Demoでは32ビットのライブラリが必要なので
$ dpkg -S libgthread-2.0.so.0 libglib2.0-0:amd64: /usr/lib/x86_64-linux-gnu/libgthread-2.0.so.0.4800.1 libglib2.0-0:amd64: /usr/lib/x86_64-linux-gnu/libgthread-2.0.so.0
dpkg
でライブラリが含まれているパッケージを探す今回は
$ apt install libglib2.0-0:amd64 パッケージリストを読み込んでいます... 完了 依存関係ツリーを作成しています 状態情報を読み取っています... 完了 libglib2.0-0 はすでに最新バージョン (2.48.1-2) です。 libglib2.0-0 は手動でインストールしたと設定されました。 アップグレード: 0 個、新規インストール: 0 個、削除: 0 個、保留: 0 個。
amd64
だけではなくi386
も必要なので
$ apt install libglib2.0-0:i386 パッケージリストを読み込んでいます... 完了 依存関係ツリーを作成しています 状態情報を読み取っています... 完了 E: パッケージ libglib2.0-0:i386 が見つかりません E: 'libglib2.0-0' に一致するパッケージは見つかりませんでした E: 正規表現 'libglib2.0-0' ではパッケージは見つかりませんでした
OSが64ビットなので32ビットのパッケージのリポジトリは追加されていないのでみつからない、なので
$ dpkg --add-architecture i386 $ apt update ヒット:1 http://ftp.ne.jp/Linux/packages/kali/kali kali-rolling InRelease 取得:2 http://ftp.ne.jp/Linux/packages/kali/kali kali-rolling/main i386 Packages [13.9 MB] 取得:3 http://ftp.ne.jp/Linux/packages/kali/kali kali-rolling/non-free i386 Packages [135 kB] 取得:4 http://ftp.ne.jp/Linux/packages/kali/kali kali-rolling/contrib i386 Packages [86.7 kB] 14.1 MB を 11秒 で取得しました (1,186 kB/s) パッケージリストを読み込んでいます... 完了 依存関係ツリーを作成しています 状態情報を読み取っています... 完了 パッケージはすべて最新です。
追加してからもう一度インストールする
$ apt install libglib2.0-0:i386 パッケージリストを読み込んでいます... 完了 依存関係ツリーを作成しています 状態情報を読み取っています... 完了 以下の追加パッケージがインストールされます: gcc-6-base:i386 libc6:i386 libffi6:i386 libgcc1:i386 libpcre3:i386 libselinux1:i386 zlib1g:i386 提案パッケージ: glibc-doc:i386 libc-l10n:i386 以下のパッケージが新たにインストールされます: gcc-6-base:i386 libc6:i386 libffi6:i386 libgcc1:i386 libglib2.0-0:i386 libpcre3:i386 libselinux1:i386 zlib1g:i386 アップグレード: 0 個、新規インストール: 8 個、削除: 0 個、保留: 0 個。 5,986 kB のアーカイブを取得する必要があります。 この操作後に追加で 16.7 MB のディスク容量が消費されます。 続行しますか? [Y/n] y
実行してみる
$ ./idaq ./idaq: error while loading shared libraries: libstdc++.so.6: cannot open shared object file: No such file or directory
まだライブラリが足りないようなので
$ ldd idaq | \grep 'not found' | awk '{ print $1 }' | xargs dpkg -S | awk '{ print $1 "i386" }' | sort | uniq libstdc++6:amd64:i386 libx11-6:amd64:i386
足りないパッケージの32ビット版をインストールしていく
$ apt install libstdc++6:i386 libx11-6:i386 パッケージリストを読み込んでいます... 完了 依存関係ツリーを作成しています 状態情報を読み取っています... 完了 以下の追加パッケージがインストールされます: libxau6:i386 libxcb1:i386 libxdmcp6:i386 以下のパッケージが新たにインストールされます: libstdc++6:i386 libx11-6:i386 libxau6:i386 libxcb1:i386 libxdmcp6:i386 アップグレード: 0 個、新規インストール: 5 個、削除: 0 個、保留: 0 個。 1,281 kB のアーカイブを取得する必要があります。 この操作後に追加で 3,933 kB のディスク容量が消費されます。 続行しますか? [Y/n] y
もう一度実行してみる
$ ./idaq This application failed to start because it could not find or load the Qt platform plugin "xcb" in "". Available platform plugins are: linuxfb, minimal, xcb. Reinstalling the application may fix this problem. 中止
今度はQt関連のエラーが出る
なのでライブラリをインストールしていく
$ apt install libqt5gui5:i386 パッケージリストを読み込んでいます... 完了 依存関係ツリーを作成しています 状態情報を読み取っています... 完了 以下のパッケージが自動でインストールされましたが、もう必要とされていません: libglew1.13 これを削除するには 'apt autoremove' を利用してください。 以下の追加パッケージがインストールされます: libbsd0:i386 libdbus-1-3:i386 libdrm-amdgpu1:i386 libdrm-intel1:i386 libdrm-nouveau2:i386 libdrm-radeon1:i386 libdrm2:i386 libedit2:i386 libegl1-mesa:i386 libelf1:i386 libevdev2:i386 libexpat1:i386 libfontconfig1:i386 libfreetype6:i386 libgbm1:i386 libgcrypt20:i386 libgl1-mesa-dri:i386 libgl1-mesa-glx:i386 libglapi-mesa:i386 libglew1.13:i386 libglu1-mesa:i386 libgpg-error0:i386 libgraphite2-3:i386 libgudev-1.0-0:i386 libharfbuzz0b:i386 libice6:i386 libicu57:i386 libinput10:i386 libjpeg62-turbo:i386 libllvm3.8:i386 liblzma5:i386 libmtdev1:i386 libpciaccess0:i386 libpcre16-3:i386 libpng16-16:i386 libproxy1v5:i386 libqt5core5a:i386 libqt5dbus5:i386 libqt5network5:i386 libqt5svg5:i386 libqt5widgets5:i386 libsm6:i386 libsystemd0:i386 libtinfo5:i386 libtxc-dxtn-s2tc0:i386 libudev1:i386 libuuid1:i386 libwacom2:i386 libwayland-client0:i386 libwayland-server0:i386 libx11-xcb1:i386 libxcb-dri2-0:i386 libxcb-dri3-0:i386 libxcb-glx0:i386 libxcb-icccm4:i386 libxcb-image0:i386 libxcb-keysyms1:i386 libxcb-present0:i386 libxcb-randr0:i386 libxcb-render-util0:i386 libxcb-render0:i386 libxcb-shape0:i386 libxcb-shm0:i386 libxcb-sync1:i386 libxcb-util0:i386 libxcb-xfixes0:i386 libxcb-xinerama0:i386 libxcb-xkb1:i386 libxdamage1:i386 libxext6:i386 libxfixes3:i386 libxi6:i386 libxkbcommon-x11-0:i386 libxkbcommon0:i386 libxrender1:i386 libxshmfence1:i386 libxxf86vm1:i386 mesa-utils:i386 提案パッケージ: rng-tools:i386 glew-utils:i386 libthai0:i386 libqt5libqgtk2:i386 qt5-image-formats-plugins:i386 qtwayland5:i386 推奨パッケージ: qttranslations5-l10n:i386 以下のパッケージは「削除」されます: mesa-utils 以下のパッケージが新たにインストールされます: libbsd0:i386 libdbus-1-3:i386 libdrm-amdgpu1:i386 libdrm-intel1:i386 libdrm-nouveau2:i386 libdrm-radeon1:i386 libdrm2:i386 libedit2:i386 libegl1-mesa:i386 libelf1:i386 libevdev2:i386 libexpat1:i386 libfontconfig1:i386 libfreetype6:i386 libgbm1:i386 libgcrypt20:i386 libgl1-mesa-dri:i386 libgl1-mesa-glx:i386 libglapi-mesa:i386 libglew1.13:i386 libglu1-mesa:i386 libgpg-error0:i386 libgraphite2-3:i386 libgudev-1.0-0:i386 libharfbuzz0b:i386 libice6:i386 libicu57:i386 libinput10:i386 libjpeg62-turbo:i386 libllvm3.8:i386 liblzma5:i386 libmtdev1:i386 libpciaccess0:i386 libpcre16-3:i386 libpng16-16:i386 libproxy1v5:i386 libqt5core5a:i386 libqt5dbus5:i386 libqt5gui5:i386 libqt5network5:i386 libqt5svg5:i386 libqt5widgets5:i386 libsm6:i386 libsystemd0:i386 libtinfo5:i386 libtxc-dxtn-s2tc0:i386 libudev1:i386 libuuid1:i386 libwacom2:i386 libwayland-client0:i386 libwayland-server0:i386 libx11-xcb1:i386 libxcb-dri2-0:i386 libxcb-dri3-0:i386 libxcb-glx0:i386 libxcb-icccm4:i386 libxcb-image0:i386 libxcb-keysyms1:i386 libxcb-present0:i386 libxcb-randr0:i386 libxcb-render-util0:i386 libxcb-render0:i386 libxcb-shape0:i386 libxcb-shm0:i386 libxcb-sync1:i386 libxcb-util0:i386 libxcb-xfixes0:i386 libxcb-xinerama0:i386 libxcb-xkb1:i386 libxdamage1:i386 libxext6:i386 libxfixes3:i386 libxi6:i386 libxkbcommon-x11-0:i386 libxkbcommon0:i386 libxrender1:i386 libxshmfence1:i386 libxxf86vm1:i386 mesa-utils:i386 アップグレード: 0 個、新規インストール: 79 個、削除: 1 個、保留: 0 個。 40.6 MB のアーカイブを取得する必要があります。 この操作後に追加で 249 MB のディスク容量が消費されます。 続行しますか? [Y/n] y
GUIを拡張するためにGTKのライブラリもインストールする
$ apt install libgtk2.0-0:i386 gtk2-engines-murrine:i386 gtk2-engines-pixbuf:i386 パッケージリストを読み込んでいます... 完了 依存関係ツリーを作成しています 状態情報を読み取っています... 完了 以下のパッケージが自動でインストールされましたが、もう必要とされていません: libglew1.13 これを削除するには 'apt autoremove' を利用してください。 以下の追加パッケージがインストールされます: libatk1.0-0:i386 libavahi-client3:i386 libavahi-common-data:i386 libavahi-common3:i386 libcairo2:i386 libcomerr2:i386 libcups2:i386 libdatrie1:i386 libgail-common:i386 libgail18:i386 libgdk-pixbuf2.0-0:i386 libgmp10:i386 libgnutls30:i386 libgssapi-krb5-2:i386 libhogweed4:i386 libidn11:i386 libjbig0:i386 libk5crypto3:i386 libkeyutils1:i386 libkrb5-3:i386 libkrb5support0:i386 libnettle6:i386 libp11-kit0:i386 libpango-1.0-0:i386 libpangocairo-1.0-0:i386 libpangoft2-1.0-0:i386 libpixman-1-0:i386 libtasn1-6:i386 libthai0:i386 libtiff5:i386 libxcomposite1:i386 libxcursor1:i386 libxinerama1:i386 libxrandr2:i386 提案パッケージ: gnutls-bin:i386 krb5-doc:i386 krb5-user:i386 librsvg2-common:i386 gvfs:i386 推奨パッケージ: murrine-themes:i386 以下のパッケージが新たにインストールされます: gtk2-engines-murrine:i386 gtk2-engines-pixbuf:i386 libatk1.0-0:i386 libavahi-client3:i386 libavahi-common-data:i386 libavahi-common3:i386 libcairo2:i386 libcomerr2:i386 libcups2:i386 libdatrie1:i386 libgail-common:i386 libgail18:i386 libgdk-pixbuf2.0-0:i386 libgmp10:i386 libgnutls30:i386 libgssapi-krb5-2:i386 libgtk2.0-0:i386 libhogweed4:i386 libidn11:i386 libjbig0:i386 libk5crypto3:i386 libkeyutils1:i386 libkrb5-3:i386 libkrb5support0:i386 libnettle6:i386 libp11-kit0:i386 libpango-1.0-0:i386 libpangocairo-1.0-0:i386 libpangoft2-1.0-0:i386 libpixman-1-0:i386 libtasn1-6:i386 libthai0:i386 libtiff5:i386 libxcomposite1:i386 libxcursor1:i386 libxinerama1:i386 libxrandr2:i386 アップグレード: 0 個、新規インストール: 37 個、削除: 0 個、保留: 0 個。 8,173 kB のアーカイブを取得する必要があります。 この操作後に追加で 21.6 MB のディスク容量が消費されます。 続行しますか? [Y/n] y
実行できるが何かメッセージがあるので
$ ./idaq Gtk-Message: Failed to load module "atk-bridge" Gtk-Message: Failed to load module "canberra-gtk-module"
それぞれインストールする
$ apt install libatk-adaptor:i386 libgail-common:i386 パッケージリストを読み込んでいます... 完了 依存関係ツリーを作成しています 状態情報を読み取っています... 完了 libgail-common:i386 はすでに最新バージョン (2.24.30-4) です。 libgail-common:i386 は手動でインストールしたと設定されました。 以下のパッケージが自動でインストールされましたが、もう必要とされていません: libglew1.13 これを削除するには 'apt autoremove' を利用してください。 以下の追加パッケージがインストールされます: libatk-bridge2.0-0:i386 libatspi2.0-0:i386 以下のパッケージが新たにインストールされます: libatk-adaptor:i386 libatk-bridge2.0-0:i386 libatspi2.0-0:i386 アップグレード: 0 個、新規インストール: 3 個、削除: 0 個、保留: 0 個。 141 kB のアーカイブを取得する必要があります。 この操作後に追加で 495 kB のディスク容量が消費されます。 続行しますか? [Y/n] y
$ sudo apt install libcanberra-gtk-module:i386 パッケージリストを読み込んでいます... 完了 依存関係ツリーを作成しています 状態情報を読み取っています... 完了 以下のパッケージが自動でインストールされましたが、もう必要とされていません: libglew1.13 これを削除するには 'sudo apt autoremove' を利用してください。 以下の追加パッケージがインストールされます: libasound2:i386 libcanberra-gtk0:i386 libcanberra0:i386 libltdl7:i386 libogg0:i386 libtdb1:i386 libvorbis0a:i386 libvorbisfile3:i386 提案パッケージ: libasound2-plugins:i386 libcanberra-pulse:i386 以下のパッケージが新たにインストールされます: libasound2:i386 libcanberra-gtk-module:i386 libcanberra-gtk0:i386 libcanberra0:i386 libltdl7:i386 libogg0:i386 libtdb1:i386 libvorbis0a:i386 libvorbisfile3:i386 アップグレード: 0 個、新規インストール: 9 個、削除: 0 個、保留: 0 個。 863 kB のアーカイブを取得する必要があります。 この操作後に追加で 2,251 kB のディスク容量が消費されます。 続行しますか? [Y/n] y
これで実行できる
結局次のコマンドを実行すればいい
$ sudo dpkg --add-architecture i386 $ sudo apt update $ sudo apt upgrade $ sudo apt install libglib2.0-0:i386 libstdc++6:i386 libx11-6:i386 libqt5gui5:i386 libgtk2.0-0:i386 gtk2-engines-murrine:i386 gtk2-engines-pixbuf:i386 libatk-adaptor:i386 libgail-common:i386 libcanberra-gtk-module:i386
UbuntuでcURL+RapidJSONを使いC++からapiを叩く
環境
ライブラリの設定
libcurlのインストール
libcurlとはcURLをC言語から使えるようにしたライブラリ。Ubuntuならapt-getで簡単にインストールできる
$ sudo apt-get update
$ sudo apt-get install curl libcurl3 libcurl3-dev
RapidJSONのインストール
RapidJSONとはC言語からJSONを扱うライブラリ。Rapidとあるようにパフォーマンス重視のライブラリ。
これもUbuntuならapt-getで簡単にインストールできる
$ sudo apt-get update
$ sudo apt-get install rapidjson-dev
使い方
libcurl
GoogleにGETでリクエストしてそれを表示するだけ
//test.cpp
#include <iostream>
#include <curl/curl.h>
int main(void){
CURL *curl;
CURLcode res;
curl = curl_easy_init();
if(curl) {
curl_easy_setopt(curl, CURLOPT_URL, "https://google.co.jp");
res = curl_easy_perform(curl);
if(res != CURLE_OK)
fprintf(stderr, "curl_easy_perform() failed: %s\n",curl_easy_strerror(res));
curl_easy_cleanup(curl);
}
return 0;
}
コンパイルするときは[-lcurl]オプションをつける
$ g++ test.cpp -lcurl
# ./a.out
<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>301 Moved</TITLE></HEAD><BODY>
<H1>301 Moved</H1>
The document has moved
<A HREF="https://www.google.co.jp/">here</A>.
</BODY></HTML>
libcurlとRapidJSON
JSON-POSTの場合
変数に代入したいときはcallback関数を用意してあげる
これはチュウニズムネットにPOSTしてレートを取得するもの
//レスポンスデータ
{
"userId": 2038082304583461,
"userInfo": {
"characterFileName": "img/0ec6bc2a17e68e8d.png",
"characterLevel": 14,
"friendCount": 0,
"highestRating": 1386,
"level": 49,
"playCount": 393,
"playerRating": 1385,
"point": 569100,
"reincarnationNum": 0,
"totalPoint": 867000,
"trophyName": "ちぇえええええええええええええええええん",
"trophyType": 2,
"userName": "NIS",
"webLimitDate": "2016-08-05 04:00:00.0"
}
}
//chunithm.cpp
#include <iostream>
#include <curl/curl.h>
#include <string>
#include "rapidjson/document.h"
#include "rapidjson/writer.h"
#include "rapidjson/stringbuffer.h"
#include "rapidjson/filewritestream.h"
size_t callbackWrite(char *ptr, size_t size, size_t nmemb, std::string *stream)
{
int dataLength = size * nmemb;
stream->append(ptr, dataLength);
return dataLength;
}
std::string curl_JSON_POST(std::string post_data,std::string url){
CURL *curl;
CURLcode ret;
curl = curl_easy_init();
std::string chunk;
/*エラー処理*/
if (curl == NULL) {
std::cerr << "curl_easy_init() failed" << std::endl;
return "error";
}
curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, post_data.c_str());
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, callbackWrite);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &chunk);
ret = curl_easy_perform(curl);
curl_easy_cleanup(curl);
/*エラー処理*/
if (ret != CURLE_OK) {
std::cerr << "curl_easy_perform() failed." << std::endl;
return "error";
}
return chunk;
}
std::string rate_get(std::string userid){
std::string url = "https://chunithm-net.com/ChuniNet/GetUserInfoApi";
std::string post_data = "{\"userId\":\"";
post_data += userid;
post_data += "\",\"friendCode\":0,\"fileLevel\":1}";
std::string data = curl_JSON_POST(post_data,url);
return data;
}
int main(){
int rate;
std::string userid;
std::cout<<"userID : ";
std::cin>>userid;
rapidjson::Document document,doc;
std::string data = rate_get(userid);
if(document.Parse(data.c_str()).HasParseError() == false){
rapidjson::Value& a = document["userInfo"];
std::cout<<"rate:"<<(double)(a["playerRating"].GetInt())/100<<std::endl;
}else{
std::cout<<"error"<<std::endl;
}
return 0;
}
$ g++ chunithm.cpp -lcurl
$ ./a.out
userID : 2038082304583461
rate:13.85
UbuntuにApache+PHP7でWebサーバー、Postfix+Dovecot+Rainloop+MySQLでWebメール構築
環境
ポイントはApacheを先にインストールすること!
Webサーバーの構築
Apacheのインストール
$sudo apt-get update
$ sudo apt-get install apache2
http://~などでアクセスしてみて、インストールできてるか確認
PHP7のインストール
php7は標準ではインストール出来ないのでPPAを追加します
$ sudo add-apt-repository ppa:ondrej/php
php7とphp7のMySQLモジュールをインストールします
$ sudo apt-get update
$ sudo apt-get install php7.0 php7.0-mysql libapache2-mod-php7.0 php7.0-mcrypt
インストールが完了したら、Apacheを再起動して、以下のソースをwebルート(/var/www/html/)にアップロードしてブラウザからアクセスしてみます
$ sudo service apache2 restart
<?php
phpinfo();
?>
phpの設定が表示されれば成功です
MySQLのインストール
次にMySQLをインストールします
$ sudo apt-get install mysql-server
インストールの時にrootのパスワードの設定するよう求められるので設定します。
完了したら以下のコマンドで、rootとして設定したパスワードでMySQLにアクセスできればインストール成功です。
$ mysql -u root -p
Webメールの構築
ユーザー名/パスワード:hoge/hagehage
とする
Postfixの設定
SMTPサーバー。ポート25を使用して、外部のSMTPサーバーからのメール受信や、外部SMTPサーバーへのメール送信を行う。MTA(Message Transfer Agent)とも呼ばれる。
インストール
$ sudo apt-get install postfix
メールサーバーのタイプは[Internet Site]を選択します。 システムメール名(デフォルトのドメイン名のようなもの)はドメイン名を指定します。
設定ファイル編集
設定ファイルをコピーしてから編集
$ mv /etc/postfix/main.cf /etc/postfix/main.cf.old
$ cp /usr/share/postfix/main.cf.dist /etc/postfix/main.cf
$ vi /etc/postfix/main.cf
#基本設定
myhostname = hoge.com
mydomain = hoge.com
myorigin = $mydomain
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
relay_domains = $mydestination
home_mailbox = Maildir/ #ユーザーディレクトリ内にメールが格納される
mynetworks = 127.0.0.0/8
inet_interfaces = all
inet_protocols = ipv4
#以下コメントアウトする
#sendmail_path =
#newaliases_path =
#mailq_path =
#setgid_group =
#html_directory =
#manpage_directory =
#sample_directory =
#readme_directory =
#SMTP-Auth設定(追記する)
#認証にはdovecotを参照させる(Dovecotと同じユーザー名/パスワードで認証可能にする)
smtpd_sasl_auth_enable = yes
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/dovecot-auth
smtpd_client_restrictions = permit_mynetworks, reject_unknown_client, permit
smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination
#スパム対策(追記する)
smtpd_etrn_restrictions = reject
smtpd_helo_required = yes
disable_vrfy_command = yes
Postfixを再起動する
$ newaliases
# /etc/init.d/postfix restart
[ ok ] Restarting postfix (via systemctl): postfix.service.
Dovecotの設定
DovecotはPostfixが保存したメールをメーラーへと渡すPOP3/IMAPサーバー。
この時のDovecotの認証方法をそのままPostfixのSMTP-Auth認証時に参照させる。
インストール
$ apt-get install dovecot-common dovecot-imapd dovecot-pop3d
認証方法を設定する
Dovecotの認証にはいくつかの方法があるが、最もわかりやすいパスワードフアイルを参照する方法(auth-passwdfile)で設定する。
OSのpasswdファイルと似た書式でDovecot専用のパスワードファイルを作製し参照させる。
$ vi /etc/dovecot/conf.d/10-auth.conf
disable_plaintext_auth = no #コメントを外す
auth_mechanisms = plain login #コメントを外す
!include auth-passwdfile.conf.ext #コメントを外す
パスワードファイルの参照先を設定
$ vi/etc/dovecot/conf.d/auth-passwdfile.conf.ext
このように書き換える
passdb {
driver = passwd-file
#args = scheme=CRYPT username_format=%u /etc/dovecot/users
args = /etc/dovecot/users
}
userdb {
driver = passwd-file
#args = username_format=%u /etc/dovecot/users
# Default fields that can be overridden by passwd-file
#default_fields = quota_rule=*:storage=1G
# Override fields from passwd-file
#override_fields = home=/home/virtual/%u
args = /etc/dovecot/users
}
パスワードファイルを用意
Dovecotのパスワードフアイルは暗号化してから記載する。
ユーザー名:hoge、パスワード:hagehageの時の暗号化文は以下のコマンドで取得できる。
$ doveadm pw -s DIGEST-MD5 -u hoge -p hagehage
{DIGEST-MD5}8687f71fc51f3392269ee94cbc1d33f1
参照先として指定した場所にパスワードファイルを作製する。
(ユーザー名):(暗号化済みパスワード) の形式で記載する。
$ vi /etc/dovecot/users
hoge:{DIGEST-MD5}8687f71fc51f3392269ee94cbc1d33f1
その他編集
$ vi /etc/dovecot/dovecot.conf
# 30行目:変更(IPv6をリスンしない場合)
listen = *
$ vi etc/dovecot/conf.d/10-mail.conf
# 30行目:Maildir形式に変更
mail_location = maildir:~/Maildir
$ vi /etc/dovecot/conf.d/10-master.conf
# 96-98行目:コメント解除し追記
# Postfix smtp-auth
unix_listener /var/spool/postfix/private/auth {
mode = 0666
user = postfix
group = postfix
}
$ vi /etc/dovecot/conf.d/10-ssl.conf
# 6行目:コメント解除して変更(SSLなし)
ssl = no
# 12,13行目:コメントにする
#ssl_cert = </etc/dovecot/dovecot.pem
#ssl_key = </etc/dovecot/private/dovecot.pem
再起動
Dovecotを再起動し設定を反映させる。
$ /etc/init.d/dovecot restart
動作確認
telnetで接続してPostfix・Dovecot認証の動作確認を行う
POP3動作確認
telnetで接続して認証確認をする。
POP3は平文なので、そのままユーザー名をパスワードを打てばいい。
$ telnet hoge.com 110
Trying 127.0.1.1...
Connected to hoge.com.
Escape character is '^]'.
+OK Dovecot ready.
USER hoge
+OK
PASS hogehoge
OK LOGGED IN.
こうなれば成功
$ telnet hoge.com 110
Trying 127.0.1.1...
Connected to hoge.com.
Escape character is '^]'.
+OK Dovecot ready.
USER hoge
+OK
PASS hogehoge
-ERR [AUTH] Authentication failed.
エラーが出たら次のコマンドを実行してエラーを確認します。
$ doveconf -n
SECCON 2015 Online CTF write up
2015/12/5~6の間SECCON 2015 Online CTFにチーム名BiPhoneでAkashi_SNとして5人で参加しました。CTFは初めてまだ1ヶ月ほどにしてはまぁ解けた方かな・・・?
ちなみに順位は240位でした。
僕が解いた問題のwrite upをします。
問題はGitHubにあります
Write up
SECCON WARS 2015
Youtubeのリンクがあるだけ・・・
とりあえず見てみるとStarWarsをもじったみたいな動画があり途中からQRコードが見え始める。
とにかくダウンロードしてフレームごとに分けてみる
背景だけ動いているのでもしやこれは比較明合成が使えるのではと思い
僕がよく星の写真を撮るときに使う
SiriusCompを使ってみたら
はっきりと出てくるので読み取って終わり
flag:SECCON{TH3F0RC3AVVAK3N53P7}
Unzip the file
後で他の人のwrite upを見て解きました
unzipというファイルが渡されUnzip the fileとのこと
普通に解凍しようとするとパスワードがかかっているみたい・・・
$ unzip unzip.zip Archive: unzip.zip [unzip.zip] backnumber08.txt password: skipping: backnumber08.txt incorrect password skipping: backnumber09.txt incorrect password skipping: flag incorrect password
backnumber08.txt
をとりあえず検索してみると
このようにヒットする
ファイルの中身がわかっているので既知平文攻撃だとわかる
これはpkcrackというツールで解析できるみたい
とりあえずソースをダウンロードして
$ cd pkcrack-1.2.2/test pkcrack-1.2.2/test/$ sudo make
test
ディレクトリに移動してmake
すると./src
に実行ファイルが生成される
pkcrackの使い方は、 -C [暗号化されたzipファイル] -c [暗号化されたzipファイルの中で平文がわかるファイル] -P [平文のファイルが入っている暗号化されていないzip] -p [平文のファイル] -d [出力先(復号したzipファイルの名前)]
以下のbacknumber08.zip
はbacknumber08.txt
を普通にZIP圧縮したもの
~/pkcrack-1.2.2/src/$ pkcrack -C ./unzip.zip -c backnumber08.txt -P backnumber08.zip -p backnumber08.txt -d unzip_1.zip Files read. Starting stage 1 on Mon Dec 7 14:35:35 2015 Generating 1st generation of possible key2_5299 values...done. Found 4194304 possible key2-values. Now we're trying to reduce these... Lowest number: 984 values at offset 970 Lowest number: 932 values at offset 969 Lowest number: 931 values at offset 967 Lowest number: 911 values at offset 966 Lowest number: 906 values at offset 965 Lowest number: 904 values at offset 959 Lowest number: 896 values at offset 955 Lowest number: 826 values at offset 954 Lowest number: 784 values at offset 606 Lowest number: 753 values at offset 206 Done. Left with 753 possible Values. bestOffset is 206. Stage 1 completed. Starting stage 2 on Mon Dec 7 14:35:46 2015 Ta-daaaaa! key0=270293cd, key1=b1496a17, key2=8fd0945a Probabilistic test succeeded for 5098 bytes. Ta-daaaaa! key0=270293cd, key1=b1496a17, key2=8fd0945a Probabilistic test succeeded for 5098 bytes. Stage 2 completed. Starting zipdecrypt on Mon Dec 7 14:36:14 2015 Decrypting backnumber08.txt (5315a01322ab296c211eecba)... OK! Decrypting backnumber09.txt (83e6640cbec32aeaf10ed1ba)... OK! Decrypting flag (34e4d2ab7fe1e2421808bab2)... OK! Finished on Mon Dec 7 14:36:14 2015
これで暗号化されていないunzip_1.zip
が生成される
$ unzip unzip_1.zip Archive: unzip_1.zip replace backnumber08.txt? [y]es, [n]o, [A]ll, [N]one, [r]ename: y inflating: backnumber08.txt inflating: backnumber09.txt inflating: flag $ ls backnumber08.zip unzip.zip backnumber08.txt backnumber09.txt flag unzip_1.zip $ file flag flag: Microsoft Word 2007+
flag
はwordファイルだとわかる
LibreOfficeで開いてみる
何も見えないがフォントの色を変えると出てくる
flag:SECCON{1s_th1s_passw0rd_ weak?}
Reverse-Engineering Android APK 1
これはチームメイトが前半を解いてくれ最後は僕がflagをみつけました。
なんかいいとこ取りみたい・・・
APKファイルが渡され「じゃんけんに1000回連続で勝ち続けよ」とありました
さすがにごり押しは厳しそうなのでapkファイルについて調べてたらただの圧縮ファイルであるとわかり解凍してみる。
するとclasses.dex
というファイルがあってこれがアプリの本体だとわかった。
これは、dex2jarというソフトで変換できるそうなのでやってみる
~/dex2jar-2.0$ ./d2j-dex2jar.sh classes.dex dex2jar classes.dex -> ./classes-dex2jar.jar ~/dex2jar-2.0$ ls classes-dex2jar.jar d2j-dex2smali.bat d2j-smali.bat classes.dex d2j-dex2smali.sh d2j-smali.sh d2j-baksmali.bat d2j-jar2dex.bat d2j-std-apk.bat d2j-baksmali.sh d2j-jar2dex.sh d2j-std-apk.sh d2j-dex-recompute-checksum.bat d2j-jar2jasmin.bat d2j_invoke.bat d2j-dex-recompute-checksum.sh d2j-jar2jasmin.sh d2j_invoke.sh d2j-dex2jar.bat d2j-jasmin2jar.bat lib d2j-dex2jar.sh d2j-jasmin2jar.sh
するとclasses-dex2jar.jar
というファイルができる
これはただのZIPファイルなので展開してみる
すると./com
,./android
の2つのフォルダが出てくる
./com/example/seccon2015/rock_paper_scissors/MainActivity.class
をJava Decompilerというソフトで見てみると
package com.example.seccon2015.rock_paper_scissors; import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.TextView; import java.util.Random; public class MainActivity extends Activity implements View.OnClickListener { Button P; Button S; int cnt = 0; int flag; private final Handler handler = new Handler(); int m; int n; Button r; private final Runnable showMessageTask = new Runnable() { public void run() { TextView localTextView = (TextView)MainActivity.this.findViewById(2131492946); MainActivity localMainActivity; if (MainActivity.this.n - MainActivity.this.m == 1) { localMainActivity = MainActivity.this; localMainActivity.cnt += 1; localTextView.setText("WIN! +" + String.valueOf(MainActivity.this.cnt)); } for (;;) { if (1000 == MainActivity.this.cnt) { localTextView.setText("SECCON{" + String.valueOf((MainActivity.this.cnt + MainActivity.this.calc()) * 107) + "}"); } MainActivity.this.flag = 0; return; if (MainActivity.this.m - MainActivity.this.n == 1) { MainActivity.this.cnt = 0; localTextView.setText("LOSE +0"); } else if (MainActivity.this.m == MainActivity.this.n) { localTextView.setText("DRAW +" + String.valueOf(MainActivity.this.cnt)); } else if (MainActivity.this.m < MainActivity.this.n) { MainActivity.this.cnt = 0; localTextView.setText("LOSE +0"); } else { localMainActivity = MainActivity.this; localMainActivity.cnt += 1; localTextView.setText("WIN! +" + String.valueOf(MainActivity.this.cnt)); } } } }; static { System.loadLibrary("calc"); } public native int calc(); public void onClick(View paramView) { if (this.flag == 1) { return; } this.flag = 1; ((TextView)findViewById(2131492946)).setText(""); TextView localTextView1 = (TextView)findViewById(2131492944); TextView localTextView2 = (TextView)findViewById(2131492945); this.m = 0; this.n = new Random().nextInt(3); int i = this.n; localTextView2.setText(new String[] { "CPU: Paper", "CPU: Rock", "CPU: Scissors" }[i]); if (paramView == this.P) { localTextView1.setText("YOU: Paper"); this.m = 0; } if (paramView == this.r) { localTextView1.setText("YOU: Rock"); this.m = 1; } if (paramView == this.S) { localTextView1.setText("YOU: Scissors"); this.m = 2; } this.handler.postDelayed(this.showMessageTask, 1000L); } protected void onCreate(Bundle paramBundle) { super.onCreate(paramBundle); setContentView(2130968600); this.P = ((Button)findViewById(2131492941)); this.S = ((Button)findViewById(2131492943)); this.r = ((Button)findViewById(2131492942)); this.P.setOnClickListener(this); this.r.setOnClickListener(this); this.S.setOnClickListener(this); this.flag = 0; } }
39行目にflagらしきものが・・・
$cnt
はカウンターだとわかった
どうやらcalc()
はライブラリーから読み込んでいるらしい・・・
そういえばライブラリファイルがあったなー
./rps/lib/x86/libcalc.so
をfile
コマンドでたたくと
$ file libcalc.so libcalc.so: ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV),dynamically linked, BuildID[sha1]=841ccd3a86c678914a4dc1a17bd80647ca290916, stripped
32bitのelfだとわかったので、
Retargetable Decompilerというオンラインのデコンパイラーでデコンパイルしてみると
// // This file was generated by the Retargetable Decompiler // Website: https://retdec.com // Copyright (c) 2015 Retargetable Decompiler <info@retdec.com> // Address range: 0x400 - 0x405 int32_t Java_com_example_seccon2015_rock_1paper_1scissors_MainActivity_calc(void) { // 0x400 return 7; }
calc()
はいつでも7を返すということがわかり
SECCON{" + String.valueOf((MainActivity.this.cnt + MainActivity.this.calc()) * 107) + "}"
ここを計算して
flag:SECCON{107749}
Command-Line Quiz
telnet caitsith.pwn.seccon.jp User:root Password:seccon すべての *.txt ファイルを読め
接続しクイズの答えもわかったが回答の仕方がわからず断念・・・
Steganography 1
というファイルが渡され「Find image files in the file」とのこと
このファイルはgifファイルだとわかったので拡張子を変え表示してみるとSECCON{}
としか描かれてないのに8Mはでかすぎるので
バイナリエディタで見てみるといろんなファイルフォーマットのヘッダーが含まれていたのでそれを仕様に沿って分けてみるてそれを合成すると
flagかと思ってsubmitしたがincorrectばっかりだった
結局できず断念
gpjb
はg(mp)p(ng)j(peg)b(mp)の略だったようでbmpが足らなかったから不正解だったみたい
後で解いてみた
binwalkという便利なコマンドがあるらしい
なんでもファイルを解析してくれるみたいfileコマンドの強いやつって感じかな?
aptでインストールできるものはバージョンが古いみたいなのでここからホームディレクトリにダウンロードして
$ cd binwalk-2.0.0.tar/binwalk-2.0.0 binwalk-2.0.0.tar/binwalk-2.0.0 $ ./configure binwalk-2.0.0.tar/binwalk-2.0.0 $ make binwalk-2.0.0.tar/binwalk-2.0.0 $ sudo make install
これでインストールできbinwalk
で実行できる
binwalk
でMrFusion.gpjb
を解析してみると
$ binwalk MrFusion.gif DECIMAL HEXADECIMAL DESCRIPTION -------------------------------------------------------------------------------- 0 0x0 GIF image data, version "89a", 1280 x 720 6943 0x1B1F PNG image, 1280 x 720, 8-bit colormap, interlaced 7194 0x1C1A Zlib SECCON_2015_Online_CTF data, SECCON_2015_Online_CTF, unSECCON_2015_Online_CTF size >= 922950 9727 0x25FF JPEG image data, JFIF standard 1.01 26632 0x6808 PC bitmap, Windows 3.x format, 1280 x 720 x 24 2791486 0x2A983E GIF image data, version "89a", 1280 x 720 2794240 0x2AA300 PNG image, 1280 x 720, 8-bit colormap, interlaced 2794491 0x2AA3FB Zlib SECCON_2015_Online_CTF data, SECCON_2015_Online_CTF, unSECCON_2015_Online_CTF size >= 922950 2796217 0x2AAAB9 JPEG image data, JFIF standard 1.01 2813627 0x2AEEBB PC bitmap, Windows 3.x format, 1280 x 720 x 24 5578481 0x551EF1 GIF image data, version "89a", 1280 x 720 5580896 0x552860 PNG image, 1280 x 720, 8-bit colormap, interlaced 5581147 0x55295B Zlib SECCON_2015_Online_CTF data, SECCON_2015_Online_CTF, unSECCON_2015_Online_CTF size >= 922950 5583378 0x553212 JPEG image data, JFIF standard 1.01 5601221 0x5577C5 PC bitmap, Windows 3.x format, 1280 x 720 x 24 8366075 0x7FA7FB GIF image data, version "89a", 1280 x 720 8368830 0x7FB2BE PNG image, 1280 x 720, 8-bit colormap, interlaced 8369081 0x7FB3B9 Zlib SECCON_2015_Online_CTF data, SECCON_2015_Online_CTF, unSECCON_2015_Online_CTF size >= 922950 8371932 0x7FBEDC JPEG image data, JFIF standard 1.01
このようにファイルフォーマットごとに表示してくれます
(ZlibはPNGに使われている圧縮方法なのでZlibのところは無視する)
gif→png→jpeg→bmp→gif→png→・・・のように繰り返している
#coding: UTF-8 a = [0,6943,9727,26632,2791486,2794240,2796217,2813627,5578481,5580896,5583378,5601221,8366075,8368830,8371932,8388384] #アドレス b = ['gif','png','jpg','bmp'] #拡張子 f = open("MrFusion.gif", "rb") #ファイルの読み込み for x in range(len(a)-1): open('result{:02d}.{}'.format(x, b[x % 4]), 'wb').write(f.read(a[x + 1] - a[x]))
pythonのコードを書いて実行
~/ctf/a$ ls MrFusion.gif split.py ~/ctf/a$ python split.py ~/ctf/a$ ls MrFusion.gif result03.bmp result07.bmp result11.bmp split.py result00.gif result04.gif result08.gif result12.gif result01.png result05.png result09.png result13.png result02.jpg result06.jpg result10.jpg result14.jpg ~/ctf/a$
分割されたファイルが出力される
最初と最後のファイルをネガポジ変換しすべてjpgに変換して
SiriusCompで比較明合成
Please input flag like this format SECCON{ * **}
形式が指定されていたので
flag:SECCON{OCT 21 2015 0728}
4042
謎の文章が2005年に古代遺跡から発見された。 これは何を意味している?
4042?2005?古代遺跡?ということでとりあえずググってみた
東ソー?
おっなんかヒットした
https://www.ietf.org/rfc/rfc4042.txt
RFC4042・・・?
とりあえずググってみた
RFC4042–Google検索
RFC4042 2005 年のエープリルフール発行のジョーク RFC です。 UCS4 や UCS2(Unicode) のエンコード方法である UTF-9 や UTF-18 を規定しています。 PDP-10 などの8bitベースではないマシンのためのエンコーディング…?
・・・http://www.imasy.or.jp/~yotti/rfc-joke.htmlより引用
ジョーク・・・
このファイルはUTF-9で書かれているのか・・・
rfc4042.txtにUTF-9からUCS-4に変換するコードが書かれている
/* Return UCS-4 value from UTF-9 string (C version) * Accepts: pointer to pointer to UTF-9 string * Returns: UCS-4 character, nonet pointer updated */ UINT31 UTF9_to_UCS4 (UINT9 **utf9PP) { UINT9 nonet; UINT31 ucs4; for (ucs4 = (nonet = *(*utf9PP)++) & 0xff; nonet & 0x100; ucs4 |= (nonet = *(*utf9PP)++) & 0xff) ucs4 <<= 8; return ucs4; }
Last Challenge (Thank you for playing)
規則性にのっとて変換するだけ
flag:SECCON{SEEYOUNEXTYEAR}
終わり
初めてにしてはできたかな~
でも疲れた
視野は広くしないと