備忘録

備忘録

DoubleAgent を試してみる

Ⅰ. はじめに

DoubleAgent とは?

Microsoft Application Verifer を悪用したDLL注入の事です。
セキュリティ会社 Cybellum によって 2017/03/22 に公開されました。

何ができるの?

プロセスの開始と同時に 任意の dll が読み込まれ任意コードの実行が可能になります。
dll は kernel32 よりも早い段階で読み込まれます。
以下の動画は notepad.exe が起動されると cmd.exe も起動するようにしたサンプルです。
youtu.be

.NET Core で 実行ファイル(exe)を作成する方法

2024/01/22 追記

FDDは未知の原因不明なエラーが発生する場合があります。
何か特別な理由が無い限りはSCDを推奨します。

Ⅰ. はじめに

この記事の内容は.NET Core 3.0までの内容です。

最新の情報は以下Webページを確認して下さい。
https://docs.microsoft.com/ja-jp/dotnet/core/tools/dotnet-publish

Ⅱ. FDD と SCD の違いについて

デプロイ方法の名称 略称 実行方法(.NET Core 2.0) 実行方法
(.NET Core 3.0)
Framework-dependent deployments
フレームワークに依存する展開
FDD コマンドを実行する
dotnet hoge.dll
EXEを実行する
Self-contained deployments
自己完結型の展開
SCD EXEを実行する EXEを実行する

SCD は CoreCLR と呼ばれる .NET Core のランタイムも出力する為、.NET Core ランタイムが入っていない環境でも実行することができます。

.NET Core 3.0 以上の場合

標準でフレームワーク依存(FDD)のexeファイルが出力されます。

.NET Core 2.x 以下の場合

FDD では実行ファイル(.exe)の作成ができません。
SCD で実行ファイル(.exe) を作成します。

Ⅲ. FDD のやり方

以下のコマンドを実行する
dotnet publish -c Release

以上

Ⅳ. SCDのやり方

1. 以下のコマンドを実行する

RID(Runtime Identifier) と呼ばれる値はこちらからコピペします。
https://docs.microsoft.com/en-us/dotnet/articles/core/rid-catalog

dotnet publish -c Release -r win-x64
# dotnet publish -c Release -r osx-x64
# dotnet publish -c Release -r linux-x64
2. 実行ファイルが作成される


その他

※2018/12/11 追記
.NET Coreで実行ファイル1つだけを出力する方法(Warpを利用する場合)(非推奨)
https://kagasu.hatenablog.com/entry/2018/12/11/021919

※2019/05/08 追記
.NET Coreで実行ファイル1つだけを出力する方法
https://kagasu.hatenablog.com/entry/2019/05/08/022255

※2019/01/04追記
.NET CoreをCoreRTを利用してビルドする方法
https://kagasu.hatenablog.com/entry/2019/01/04/121434

C#でプロセスのスレッド一時停止させる

Ⅰ. はじめに

プロセスのサスペンドリジュームを拡張メソッドにして使いやすくしたクラスを紹介します。
コピペで動きます。

Ⅱ. プログラム

Program.cs

var process = Process.GetProcessesByName("notepad").FirstOrDefault();
process.Threads.Suspend();
process.Threads.Resume();

ProcessExtensions.cs

public static class ProcessExtensions
{
  [Flags]
  private enum ThreadAccess : int
  {
    TERMINATE = 0x0001,
    SUSPEND_RESUME = 0x0002,
    GET_CONTEXT = 0x0008,
    SET_CONTEXT = 0x0010,
    SET_INFORMATION = 0x0020,
    QUERY_INFORMATION = 0x0040,
    SET_THREAD_TOKEN = 0x0080,
    IMPERSONATE = 0x0100,
    DIRECT_IMPERSONATION = 0x0200
  }

  [DllImport("kernel32.dll")]
  private static extern bool CloseHandle(IntPtr hHandle);

  [DllImport("kernel32.dll")]
  private static extern IntPtr OpenThread(ThreadAccess dwDesiredAccess, bool bInheritHandle, uint dwThreadId);

  [DllImport("kernel32.dll")]
  private static extern uint SuspendThread(IntPtr hThread);

  [DllImport("kernel32.dll")]
  private static extern uint ResumeThread(IntPtr hThread);

  public static void Suspend(this ProcessThreadCollection threads)
  {
    foreach (ProcessThread x in threads)
    {
      var threadHandle = OpenThread(ThreadAccess.SUSPEND_RESUME, false, (uint)x.Id);

      if (threadHandle != IntPtr.Zero)
      {
        try
        {
          SuspendThread(threadHandle);
        }
        finally
        {
          CloseHandle(threadHandle);
        }
      }
    }
  }

  public static void Resume(this ProcessThreadCollection threads)
  {
    foreach(ProcessThread x in threads)
    {
      var threadHandle = OpenThread(ThreadAccess.SUSPEND_RESUME, false, (uint)x.Id);

      if (threadHandle != IntPtr.Zero)
      {
        try
        {
          ResumeThread(threadHandle);
        }
        finally
        {
          CloseHandle(threadHandle);
        }
      }
    }
  }
}

プロテクトを回避してメモリをフルダンプする

f:id:kagasu:20170412081342p:plain

Ⅰ.はじめに

物理メモリを任意の物理記憶媒体にダンプする方法です。
Belkasoft社の無料ダンプツール(Belkasoft Live RAM Capture)を利用します。

Ⅱ. Belkasoft Live RAM Captureのすごいところ

  • 無料

ダンプ後のファイルを解析するBelkasoft Evidence Center は有料ですが、Belkasoft Live RAM Capture は無料で配布されています。

  • 簡単に任意のタイミングでダンプが可能

アプリケーション単位のメモリであれば任意のタイミングでダンプ可能ですが、
物理メモリのフルダンプはシステムのクラッシュ時にのみ可能です。
従来の方法ではBSoDを意図的に発生させシステムをクラッシュさせてフルダンプを取らなければいけません。

  • プロテクトの回避が可能

アンチデバッグやダンププロテクションといったメモリダンプを妨げるものを回避してメモリのダンプが可能です。

Ⅲ. メモリダンプ方法

1. Belkasoft Live RAM Captureをダウンロードする

http://belkasoft.com/ram-capturer

2. 保存先を指定し、Captureをクリックする

f:id:kagasu:20170412080257p:plain

3. 以上でダンプ完了です。

f:id:kagasu:20170412082346p:plain

Ⅳ. ダンプから画像ファイルを取り出す

Belkasoft Evidence Center(有料。高機能。試用可能)でも可能ですが、今回はWinHex(有料。試用可能)を利用します。

1. WinHexでダンプしたファイルを読み込む
2. Tools -> Disk Tools -> File Recovery by Type

f:id:kagasu:20170412082715p:plain

3. Picturesにチェックを入れてOKをクリックする

f:id:kagasu:20170412082834p:plain

4. メモリダンプから画像ファイルが生成されます

f:id:kagasu:20170412083007p:plain

一時的なメールサービスのAPIサーバを作る

Ⅰ. はじめに

一時的なメールアドレスを作成するサービスはいくつか存在します。
一時的なメールアドレスを作成する - 備忘録

しかし、どのサービスもAPI経由でのアクセスが出来ないものばかりです。
送信されるリクエストを解析してサービスを利用する事も可能ですが、
よりスマートにAPIアクセス可能なサーバを自分で構築する方法を紹介します。

※サーバを構築しなくても こちら(restmail.net) から制限付きで利用することも可能です。
こちらを応用して自分で作るのもアリです。

Ⅱ. やり方

0. 環境
[root@host ~]# cat /etc/redhat-release 
CentOS Linux release 7.3.1611 (Core) 
1. screen, git, nodejs, redis をインストールする
yum -y install screen git nodejs redis
2. restmail.net を入手する
git clone https://github.com/mozilla/restmail.net
3. Node.js のモジュールをインストールする
npm install
4. Redis を起動する
systemctl start redis
5. lib/config.js の port を 9025 から 25 に変更する
6. lib/config.js の webPort を 8080 から 80 に変更する
7. postfix を終了する

既に25番をpostfixが利用している為終了させます。

systemctl stop postfix
8. ポートを開放する。25番と80番
firewall-cmd --zone=public --add-port=25/tcp --permanent
firewall-cmd --zone=public --add-port=80/tcp --permanent
firewall-cmd --reload
9. サーバを起動する
node webserver.js &
node emailserver.js &

または screen を利用して

screen -S webserver
node webserver.js

[Ctrl + A] → [D]

screen -S emailserver
node emailserver.js

[Ctrl + A] → [D]
10. http://[ip address]/にアクセスして、以下のページが表示されることを確認する

f:id:kagasu:20170408163431p:plain

11. ドメインのMXレコードを変更する
12. test@domain.tld にメールを送信する
13. http://[ip address]/mail/test@domain.tld にアクセスして、JSON形式でメールが確認できれば成功