Ubuntu 上开启并使用 SSH

在 Ubuntu 上开启并使用 SSH(Secure Shell),你可以按下面的步骤操作

 

一、安装 SSH 服务端
首先确认系统中是否安装了 openssh-server:
sudo apt update
sudo apt install openssh-server -y
openssh-server 是提供远程登录功能的服务端程序,安装后即可通过 SSH 登录此主机。

 

二、启动并设置开机自启
安装完成后,启用 SSH 服务:
sudo systemctl enable ssh
sudo systemctl start ssh

查看运行状态:
sudo systemctl status ssh
如果看到 “active (running)”,说明 SSH 已成功开启。

 

三、确认端口和防火墙
默认情况下,SSH 使用端口 22。 你可以用以下命令确认:
sudo netstat -tlnp | grep ssh

或在 ufw 防火墙中允许 SSH 通信:
sudo ufw allow ssh
sudo ufw enable
sudo ufw status

 

四、测试远程连接
在另一台电脑上使用:
ssh 用户名@服务器IP
例如:
ssh ubuntu@192.168.1.10
第一次连接会提示是否信任主机,输入 yes 然后输入密码即可登录。

 

五、(可选)修改 SSH 配置
配置文件路径:
/etc/ssh/sshd_config
常用修改示例:
sudo nano /etc/ssh/sshd_config

可修改的配置项:
Port 22 # 修改默认端口
PermitRootLogin no # 禁止 root 登录(推荐)
PasswordAuthentication yes # 是否允许密码登录

修改后重启服务使其生效:
sudo systemctl restart ssh

安装 SSH 服务端

sudo apt install openssh-server -y

启动 SSH 服务

sudo systemctl start ssh

开机自启

sudo systemctl enable ssh

查看状态

sudo systemctl status ssh

开放防火墙端口

sudo ufw allow ssh

发表在 Linux安全 | 留下评论

linux分析工具xxd和hexdump

xxd 是一个把二进制文件以 十六进制 + ASCII 形式打印出来的小工具,也能把十六进制再还原回二进制。像一个不会改变文件的“十六进制放大镜”和“十六进制剪贴板”。
xxd = 十六进制查看器 + 十六进制到二进制的转换器。
常用选项:-p(纯 hex)、-r(还原)、-l(长度)、-s(偏移)、-c(每行字节数)。
修改文件时要小心——先备份或在副本上实验。
xxd -l 64 demo.bin
 
hexdump
常用命令 说明
hexdump -C file 十六进制+ASCII 输出(最常用)
hexdump -C -n 32 file 只看前 32 字节
hexdump -C -s 128 -n 16 file 从偏移 128 开始看 16 字节
hexdump -v -e ‘1/1 “%02X “‘ file 纯 HEX 字节一行输出
hexdump -v -e ‘1/1 “%03d “‘ file 十进制显示
xxd vs hexdump 对比总结
功能
xxd
hexdump -C
默认输出
整齐十六进制 + ASCII
16位分组,不直观
推荐查看方式
✅(带 -C)
反向还原文件
✅(xxd -r)
常用于脚本
✅(xxd -p 输出纯 hex)
✅(配合 -n、-s)
适合场景
编辑、修改、比对
查看文件头、调试数据流
 
 
quick_inspect.sh
#!/usr/bin/env bash
# 快速判断文件类型脚本
# 用法: ./quick_inspect.sh filename
f=”$1″
if [ -z “$f” ]; then
echo “Usage: $0 <filename>”
exit 1
fi

if [ ! -f “$f” ]; then
echo “Error: file not found: $f”
exit 2
fi

echo “== FILE INFO ==”
file “$f”
echo

echo “== HEXDUMP (first 256 bytes) ==”
hexdump -C -n 256 “$f”
echo

echo “== STRINGS (first 100 matches) ==”
strings -n 6 “$f” | head -n 100 2>/dev/null || echo “(no printable strings found)”
echo

echo “== BINWALK (quick scan) ==”
if command -v binwalk >/dev/null 2>&1; then
binwalk –signature “$f” 2>/dev/null || binwalk “$f” | head -n 80
else
echo “(binwalk not installed, skip)”
fi
echo

echo “== ENTROPY (byte-level randomness) ==”
python3 – “$f” <<‘PY’
import sys, math, pathlib
path = sys.argv[1]
data = pathlib.Path(path).read_bytes()
if not data:
print(“empty file”)
sys.exit(0)
counts = {}
for b in data:
counts[b] = counts.get(b, 0) + 1
ent = -sum((v/len(data))*math.log2(v/len(data)) for v in counts.values())
print(f”File: {path}”)
print(f”Bytes: {len(data)}”)
print(f”Unique byte values: {len(counts)}”)
print(f”Entropy: {ent:.3f} bits/byte”)
if ent < 5:
print(“→ likely TEXT or structured data”)
elif ent < 7:
print(“→ likely COMPRESSED data”)
else:
print(“→ likely ENCRYPTED or random data”)
PY
echo
echo “== DONE ==”

 

 
 
用法
chmod +x quick_inspect.sh
./quick_inspect.sh yourfile.bin
 
发表在 安全分析 | 留下评论

Linux文件的分析工具binwalk exiftool

Binwalk
Binwalk 是一个非常强大的工具,可以用来分析和提取嵌入在二进制文件(如图片、固件等)中的压缩包、文件系统或其他数据。它能够自动识别图片文件中的嵌入数据,并提取出压缩包文件。

你可以用 Binwalk 对图片文件进行分析,命令行如下:

binwalk image.png

它会扫描文件内容,寻找嵌入的压缩包或其他数据格式。如果图片文件中嵌入了一个压缩包,Binwalk 会标识出压缩包的起始位置,显示文件类型及大小。

如果找到压缩包,使用 binwalk -e 可以直接提取它:

binwalk -e image.png

github项目:https://github.com/devttys0/binwalk
binwalk的wiki:https://github.com/devttys0/binwalk/wiki

推荐Linux安装,一条命令搞定!

apt install binwalk

 

root@iZbp14ur7ieacjwvas:~# binwalk

Binwalk v2.3.3
Craig Heffner, ReFirmLabs
https://github.com/ReFirmLabs/binwalk

Usage: binwalk [OPTIONS] [FILE1] [FILE2] [FILE3] …

Signature Scan Options:
-B, –signature Scan target file(s) for common file signatures
-R, –raw=<str> Scan target file(s) for the specified sequence of bytes
-A, –opcodes Scan target file(s) for common executable opcode signatures
-m, –magic=<file> Specify a custom magic file to use
-b, –dumb Disable smart signature keywords
-I, –invalid Show results marked as invalid
-x, –exclude=<str> Exclude results that match <str>
-y, –include=<str> Only show results that match <str>

Extraction Options:
-e, –extract Automatically extract known file types
-D, –dd=<type[:ext[:cmd]]> Extract <type> signatures (regular expression), give the files an extension of <ext>, and execute <cmd>
-M, –matryoshka Recursively scan extracted files
-d, –depth=<int> Limit matryoshka recursion depth (default: 8 levels deep)
-C, –directory=<str> Extract files/folders to a custom directory (default: current working directory)
-j, –size=<int> Limit the size of each extracted file
-n, –count=<int> Limit the number of extracted files
-0, –run-as=<str> Execute external extraction utilities with the specified user’s privileges
-1, –preserve-symlinks Do not sanitize extracted symlinks that point outside the extraction directory (dangerous)
-r, –rm Delete carved files after extraction
-z, –carve Carve data from files, but don’t execute extraction utilities
-V, –subdirs Extract into sub-directories named by the offset

Entropy Options:
-E, –entropy Calculate file entropy
-F, –fast Use faster, but less detailed, entropy analysis
-J, –save Save plot as a PNG
-Q, –nlegend Omit the legend from the entropy plot graph
-N, –nplot Do not generate an entropy plot graph
-H, –high=<float> Set the rising edge entropy trigger threshold (default: 0.95)
-L, –low=<float> Set the falling edge entropy trigger threshold (default: 0.85)

Binary Diffing Options:
-W, –hexdump Perform a hexdump / diff of a file or files
-G, –green Only show lines containing bytes that are the same among all files
-i, –red Only show lines containing bytes that are different among all files
-U, –blue Only show lines containing bytes that are different among some files
-u, –similar Only display lines that are the same between all files
-w, –terse Diff all files, but only display a hex dump of the first file

Raw Compression Options:
-X, –deflate Scan for raw deflate compression streams
-Z, –lzma Scan for raw LZMA compression streams
-P, –partial Perform a superficial, but faster, scan
-S, –stop Stop after the first result

General Options:
-l, –length=<int> Number of bytes to scan
-o, –offset=<int> Start scan at this file offset
-O, –base=<int> Add a base address to all printed offsets
-K, –block=<int> Set file block size
-g, –swap=<int> Reverse every n bytes before scanning
-f, –log=<file> Log results to file
-c, –csv Log results to file in CSV format
-t, –term Format output to fit the terminal window
-q, –quiet Suppress output to stdout
-v, –verbose Enable verbose output
-h, –help Show help output
-a, –finclude=<str> Only scan files whose names match this regex
-p, –fexclude=<str> Do not scan files whose names match this regex
-s, –status=<int> Enable the status server on the specified port

root@iZbp14ur7ieacjwvas:~#

 

binwalk常用命令
-e 分解出压缩包

binwalk -e test.bin

-D或者–dd 分解某种类型的文件

binwalk -D=jpeg test.bin

-M 递归分解扫描出来的文件(得跟-e或者-D配合使用)

binwalk -eM test.bin

exiftool

Ubuntu / Debian 系列

sudo apt update
sudo apt install libimage-exiftool-perl -y

安装完成后,可以通过以下命令验证:

exiftool -ver

输出版本号(如 12.76)即表示安装成功。

发表在 安全分析 | 留下评论

容器日志的保存方式

容器日志的保存方式

下面是几种常见情况👇
🧩 1. 默认情况(使用 Docker
自带日志驱动)

Docker 默认用 json-file

驱动记录日志,日志文件保存在宿主机上:

/var/lib/docker/containers/<container-id>/<container-id>-json.log

✅ 容器重启 (docker restart):
日志仍然存在,新日志会继续追加在原文件后面。
❌ 容器被删除 (docker rm):
对应的日志文件也会被删掉。

👉 所以只要是“重启”,日志不会丢;只有“删除容器”才会。
🪣 2. 使用了日志驱动或外部日志系统

如果容器配置了其他日志驱动,例如:

–log-driver=syslog

–log-driver=fluentd
–log-driver=gelf
–log-driver=awslogs

等,那么日志会被发送到外部系统。

✅ 这种情况重启也不会丢日志(因为日志早已发出去了)。
💾 3. 如果你想确保日志长期保存

可以这样做:

挂载日志目录:
docker run -v /mylogs:/var/log/myapp myimage
日志会保存在宿主机 /mylogs 里。
使用 Docker Compose

+ 外部日志收集系统(ELK / Loki / Promtail

等)。
使用 logrotate 限制日志大小,避免文件太大。

🔍 查看日志命令

docker logs <container-name>

如果容器重启后你还能看到旧日志,说明没丢;
如果没看到,可能是容器被重新创建(不是简单的 restart,而是重新 run)

发表在 容器安全 | 留下评论

Docker安装和发布服务

一键操作步骤:安装并发布 Hello World 网页

1. 拉取 Nginx

镜像

docker pull nginx:latest

直接拉取镜像报错

Root@iZbp14ur7ieacjwvas5z58Z:~# docker pull nginx:latest

Error response from daemon: Get “registry-1.docker.io/v2“: context deadline exceeded

说明 Docker 客户端在请求 Docker Hub

时超时,通常是网络或镜像源的问题。下面给出可直接操作的解决步骤:

✅ 1. 检查网络是否能访问 Docker Hub

bash

ping registry-1.docker.io

curl -v registry-1.docker.io/v2

如果 ping 不通或 curl 超时 → 说明网络被阻断,需要换镜像源。

如果能通,但 docker pull 超时 → 很可能是 Docker 配置问题。

✅ 2. 配置国内镜像源(推荐解决方案)

在国内直接访问 Docker Hub 容易超时,可以使用加速器。

编辑配置文件:

mkdir -p /etc/docker
nano /etc/docker/daemon.json

写入内容(任选一个加速器):

{
  "registry-mirrors": [
    "https://docker.m.daocloud.io",
    "https://hub-mirror.c.163.com",
    "https://mirror.baidubce.com"
  ]
}

保存后,重启 Docker:

systemctl daemon-reexec
systemctl restart docker

测试拉取:

docker pull nginx:latest

✅ 3. 如果还是不行,尝试代理

如果服务器在国外网络环境比较差,可以临时用代理:

export HTTP_PROXY=http://<代理IP>:<端口>
export HTTPS_PROXY=http://<代理IP>:<端口>

然后再执行:

docker pull nginx:latest

✅ 4. 确认 DNS 正常

有时候是 DNS 解析

失败,可以改用公共 DNS

编辑 /etc/resolv.conf:

nameserver 8.8.8.8
nameserver 1.1.1.1

保存后重启 Docker:

systemctl restart docker

发现默认DNS 配置的有问题:

重启服务报错

root@iZbp14ur7ieacjwvas5z58Z:/etc/docker# systemctl restart docker

Job for docker.service failed because the control process exited with error code.

See “systemctl status docker.service” and “journalctl -xeu docker.service” for details.

2. 创建一个本地网页文件

先在宿主机新建一个目录并写入 index.html:

mkdir ~/hello-docker
echo "Hello World from Docker!" > ~/hello-docker/index.html

3. 运行容器并挂载网页

把你写好的 index.html 挂载到 Nginx 默认目录 /usr/share/nginx/html:

docker run -d \
  --name hello-web \
  -p 8080:80 \
  -v ~/hello-docker:/usr/share/nginx/html \
  nginx:latest

解释:

-d → 后台运行
--name hello-web → 给容器起个名字
-p 8080:80 → 宿主机 8080 端口映射到容器 80
-v ~/hello-docker:/usr/share/nginx/html → 挂载自定义网页

在 docker run -d \ 中的 斜杠 (\) 是用来 表示命令继续到下一行,这是在命令行中常见的 换行符。

解释:

\:是 Linux 和 macOS 系统中的 行继续符。它告诉 shell 这条命令没有结束,可以继续在下一行输入。

这样做的好处是:

提高可读性:长命令可以分成多行,便于查看和维护。

避免命令超长:如果一行太长,可能导致命令难以理解或显示不全。

如果没有斜杠,命令必须写成一行:

docker run -d –name hello-web -p 8080:80 -v ~/hello-docker:/usr/share/nginx/html nginx:latest

这两者作用是一样的,只是前者更清晰、易于阅读。

4. 测试访问

浏览器打开:

http://localhost:8080

你应该能看到:

Hello World from Docker!

5. 停止与删除容器(可选)

docker stop hello-web
docker rm hello-web
发表在 容器安全 | 留下评论

Docker容器启动和关闭镜像管理

在Docker中,容器是镜像的运行实例,可以在主机操作系统上同时运行多个容器。查看正在运行的Docker容器是日常管理和维护的基本操作之一。
查看运行中的容器
要查看当前正在运行的Docker容器,可以使用以下命令:

docker ps

添加图片注释,不超过 140 字(可选)
或者:

docker container ls

添加图片注释,不超过 140 字(可选)
这些命令会列出所有活跃的容器,包括容器ID、使用的镜像、执行的命令、创建时间、状态、开放的端口以及容器名称等信息。

如果想要查看包括已停止的在内的所有容器,可以添加 -a 参数:

docker ps -a

或者:

docker container ls -a

示例输出
执行 docker ps 命令后,你应该会看到类似以下的输出:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ce2c487c79c6 mysql “docker-entrypoint…” 27 hours ago Up 27 hours 0.0.0.0:3306->3306/tcp, 33060/tcp mysql01

这表示有一个名为 mysql01 的容器正在运行,使用的是 mysql 镜像,并且已经运行了27小时。
其他有用的参数

-q 参数可以仅显示容器ID,这在编写脚本时非常有用。
-f 参数可以根据条件过滤显示的内容,例如,只显示已退出的容器。
–format 参数可以指定返回值的模板文件,以自定义输出格式。

启动和停止容器
如果需要启动一个已停止的容器,可以使用 docker start 命令,后面跟上容器ID或名称:

docker start [container-id or container-name]

例如,要启动ID为 ce2c487c79c6 的容器,可以执行:

docker start ce2c487c79c6

同样地,要停止一个正在运行的容器,可以使用 docker stop 命令:

docker stop [container-id or container-name]

查本地已下载的镜像

docker images

添加图片注释,不超过 140 字(可选)

查找本地 Docker 资源(通用)

docker system df

可以看到占用的镜像、容器、卷的空间情况。
添加图片注释,不超过 140 字(可选)

Docker的网络
Docker的几种网络方案:none、host、bridge和joined容器,它们解决了单个Docker Host内容器通信的问题

跨主机网络方案包括:
(1)docker原生的overlay和macvlan;
(2)第三方方案:常用的包括flannel、weave和calico。

docker network ls

添加图片注释,不超过 140 字(可选)

添加图片注释,不超过 140 字(可选)

构建docker 出错
ERROR: failed to build: failed to solve: DeadlineExceeded: nginx:alpine: failed to resolve source metadata for docker.io/library/nginx:alpine: failed to do request: Head “https://registry-1.docker.io/v2/library/nginx/manifests/alpine”: dial tcp 98.159.108.71:443: i/o timeout
添加图片注释,不超过 140 字(可选)

 

发表在 容器安全 | 留下评论

ubuntu安装的工具

在 Ubuntu 中,netstat 命令属于 net-tools 软件包。 默认情况下,新的 Ubuntu 版本(如 20.04+)不会预装它。
🧰 安装 netstat
执行以下命令即可:
sudo apt update
sudo apt install net-tools -y
安装完成后,你可以验证:
netstat -tlnp
若输出类似:
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1234/sshd
说明安装成功 ✅
发表在 Linux安全 | 留下评论

Linux grep参数

grep(global regular expression print)是 Linux 中用来搜索文本内容的工具,它支持正则表达式的匹配,能够高效地查找和过滤文件中的信息。以下是 grep 常用参数的 全称解释 和 举例说明:

参数 全称 说明 示例

-a –text 将二进制文件当作文本文件处理 grep -a “password” /usr/bin/somefile

-i –ignore-case 忽略大小写 grep -i “error” logfile.txt

-n –line-number 显示行号 grep -n “root” /etc/passwd

-v –invert-match 反向匹配 grep -v “nologin” /etc/passwd

-r –recursive 递归目录

grep -r “TODO” /home/user/code/

-l –files-with-matches 仅显示匹配文件名 grep -l “main” *.c

-L –files-without-match 显示不匹配的文件名 grep -L “main” *.c

-c –count 显示匹配行数 grep -c “bash” /etc/passwd

-o –only-matching 只输出匹配部分 grep -o “bash” /etc/passwd

-w –word-regexp 匹配完整单词 grep -w “cat” words.txt

-A NUM –after-context=NUM 匹配行及后 N 行 grep -A 2 “error” logfile.txt

-B NUM –before-context=NUM 匹配行及前 N 行 grep -B 2 “error” logfile.txt

-C NUM –context=NUM 匹配行及前后 N 行 grep -C 3 “error” logfile.txt

-E –extended-regexp 启用扩展正则表达式

`grep -E “cat

-F –fixed-strings 按固定字符串匹配 grep -F “a.b” file.txt

–color=auto –color 高亮显示匹配文本 grep –color=auto “main” *.c

示例解析:

忽略大小写并显示行号:
grep -i -n “error” logfile.txt
解释:-i 忽略大小写,-n 显示匹配行的行号,查找 logfile.txt 文件中包含 “error” 的行。

递归查找目录下的匹配:
grep -r “TODO” /home/user/code/
解释:-r 递归搜索 /home/user/code/ 目录下的所有文件,查找包含 “TODO” 的行。

只显示文件名:
grep -l “main” *.c
解释:-l 只显示包含 “main” 的文件名,而不显示具体内容。

反向匹配:
grep -v “nologin” /etc/passwd
解释:-v 显示不包含 “nologin” 的所有行。

统计匹配行数:
grep -c “bash” /etc/passwd
解释:-c 统计文件中包含 “bash” 的行数。

显示匹配行及其前后行:
grep -C 2 “error” logfile.txt
解释:-C 2 显示匹配行以及前后 2 行的内容,帮助你更好地查看上下文。

扩展正则表达式:
grep -E “cat|dog” animals.txt
解释:-E 使 grep 支持扩展正则表达式,查找包含 “cat” 或 “dog” 的行。

只输出匹配的部分:
grep -o “bash” /etc/passwd
解释:-o 只输出匹配到的文本部分,而不是整行。

发表在 安全分析 | 留下评论

Linux vim的快捷键

常用的 vim

快捷键和命令:

🧑‍💻 常用快捷键:

光标移动

  • h → 向左移动一个字符
  • j → 向下移动一行
  • k → 向上移动一行
  • l → 向右移动一个字符
  • w → 移动到下一个单词的开头
  • b → 移动到当前单词的开头
  • e → 移动到当前单词的结尾
  • $ → 移动到行尾
  • 0 → 移动到行首
  • gg → 跳转到文件的第一行
  • G → 跳转到文件的最后一行
  • 10G → 跳转到第 10 行

编辑操作

  • i → 进入插入模式(光标前)
  • I → 进入插入模式(行首)
  • a → 进入插入模式(光标后)
  • A → 进入插入模式(行尾)
  • o → 在当前行下方插入新行
  • O → 在当前行上方插入新行
  • x → 删除当前光标所在的字符
  • dd → 删除当前行
  • d$ → 删除当前行从光标到行尾的部分
  • dw → 删除当前光标所在的单词
  • yy → 复制当前行
  • p → 粘贴到光标后
  • u → 撤销操作
  • Ctrl + r → 重做操作

搜索和替换

  • /word → 向下搜索 word
  • ?word → 向上搜索 word
  • n → 跳转到下一个匹配项
  • N → 跳转到上一个匹配项
  • :%s/old/new/g → 替换文件中所有的 oldnew
  • :s/old/new/g → 替换当前行的所有 oldnew

其他常用命令:

  • :w → 保存文件
  • :q → 退出 vim
  • :wq → 保存并退出 vim
  • :q! → 强制退出,不保存文件
  • :x → 保存并退出(与 :wq 相同)
  • :e filename → 打开指定文件
  • :!command → 执行外部命令
  • :set number → 显示行号
  • :set nonumber → 隐藏行号

视图操作:

  • Ctrl + f → 向下翻页
  • Ctrl + b → 向上翻页
  • Ctrl + d → 向下滚动半页
  • Ctrl + u → 向上滚动半页

模式切换

  • Esc → 退出插入模式,回到普通模式
  • v → 进入可视模式,按字符选择
  • V → 进入行选择模式,按行选择
  • Ctrl + v → 进入块选择模式,按列选择

📘 vim 的其他有用小技巧:

  1. 快速跳转:
  • f<char> → 在当前行中跳到下一个 char 字符
  • t<char> → 跳到下一个 char 字符前的位置

  1. 行内移动:
  • w → 跳到下一个单词的开头
  • e → 跳到当前单词的结尾
  • b → 跳到当前单词的开头
  • 0 → 跳到行首
  • $ → 跳到行尾
  • Ctrl + f → 向下翻一页
  • Ctrl + b → 向上翻一页

  1. 复制、剪切、粘贴:
  • yy → 复制当前行
  • dd → 删除当前行
  • p → 粘贴到光标后
  • P → 粘贴到光标前
  • D → 删除从光标到行尾的内容

  1. 跳到文件开头或结尾:
  • gg → 跳到文件开头
  • G → 跳到文件结尾
发表在 安全分析 | 留下评论

Linux的静态分析步骤

 

Linux的静态分析

步骤(按优先级)

  1. 元信息识别

:文件类型(PE/ELF/Python/PowerShell/Office macro/ZIP 等)、文件大小、时间戳、入口点等。
原始字符串抽取
(包括二进制内嵌、UTF-16、被零字节分隔的字符串)。
通过正则抽取可疑网络 IOCs:域名、URL、IPv4/IPv6、端口、邮箱、User-Agent、常见 C2 路径、常见后门关键字(beacon, cmd, shell, download, connect 等)。
查找常见加密/混淆痕迹:base64 大块、hex、大量短可疑函数名、重复异或或多字节熵高区域。
寻找配置/硬编码数据:常见 C2 配置结构(域名列表、端口、sleep interval、mutex 名称)。
对可疑字符串做上下文关联(出现在哪个节/偏移、是否出现在导入表/资源/PE 数据段
)。
生成 IOC 清单

与时间线摘要,并给出可落地的检测/阻断规则(YARA / Snort / Zeek

/ 简单正则)。


本地可直接运行的命令(不用执行样本,仅静态提取)

sample.bin 替换成你的文件名。

基本字符串提取(包含 UTF-16 LE):

# 普通可读字符串(最短长度 6)
strings -a -n 6 sample.bin > strings.txt

# UTF-16 LE 小字长字符串
strings -el -n 6 sample.bin >> strings.txt

用 grep 抽取域名 / URL / IP:

# 提取 IPv4(简易)
grep -Eo '([0-9]{1,3}\.){3}[0-9]{1,3}' strings.txt | sort -u > suspects.ipv4.txt

# 提取域名(包含二级/三级域名)
grep -Eo '([a-zA-Z0-9_\-]+\.)+[a-zA-Z]{2,}' strings.txt | sort -u > suspects.domains.txt

# 提取 URL
grep -Eo '(http|https)://[^\s"'\''<>]+' strings.txt | sort -u > suspects.urls.txt

抽取可能被用作 C2 的端口/路径(示例):

grep -Eo ':[0-9]{2,5}' strings.txt | sort -u > suspects.ports.txt
grep -Eo '/[A-Za-z0-9_\-/]{3,100}' strings.txt | sort -u > suspects.paths.txt

查找 base64 大块(可能为配置):

grep -Eo '[A-Za-z0-9+/]{40,}={0,2}' strings.txt | sort -u > suspects.base64.txt

查找 hex 长串(可能是 XOR/密钥/二进制 blob):

grep -Eo '\b([0-9a-fA-F]{8,})\b' strings.txt | sort -u > suspects.hex.txt

rabin2 / readelf / objdump / pefile(视平台)查看导入与节信息:

# ELF
readelf -a sample.bin > metadata.txt

# PE (Windows)
rabin2 -I sample.bin > pe_info.txt
rabin2 -zz sample.bin > resources.txt

binwalk 看是否有嵌套档案/压缩:

binwalk -e sample.bin

yara 匹配已知特征(见下方 YARA 示例):


推荐的正则(可直接用来在 strings.txt 中 grep)

IPv4(更严格可加 0-255 范围校验):

\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9]{1,2})\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9]{1,2})\b

域名(基础版本):

\b([a-zA-Z0-9][a-zA-Z0-9\-]{0,62}\.)+[a-zA-Z]{2,63}\b

URL:

\bhttps?://[^\s'"]{5,200}\b

Base64 长串:

\b[A-Za-z0-9+/]{40,}={0,2}\b

YARA 模板(用于捕获常见网络指示器/简单特征)

把下面保存为 c2_indicators.yar,然后用 yara -r c2_indicators.yar sample.bin 运行。

rule Suspicious_C2_Indicators
{
    meta:
        author = "analyst"
        description = "Detects embedded domains, urls, and IP-like strings commonly used as C2"
        date = "2025-10-16"
    strings:
        $s_ip = /(?:(?:25[0-5]|2[0-4]\d|[01]?\d{1,2})\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d{1,2})/
        $s_domain = /([a-zA-Z0-9][a-zA-Z0-9\-]{0,62}\.)+[a-zA-Z]{2,63}/
        $s_http = /https?:\/\/[^\x00-\x1F\x7F"']{5,200}/
        $s_base64 = /[A-Za-z0-9+\/]{32,}={0,2}/
        // 常见后门/Beacon 关键词(可扩展)
        $k_beacon = "beacon" wide ascii
        $k_sleep = "sleep" wide ascii
        $k_config = "config" wide ascii
    condition:
        any of ($s_*) or any of ($k_*)
}

注:YARA 用于触发高概率的可疑样本,但并不总是代表确证;后续要结合上下文。


针对混淆/异或/加密的可疑模式检测(思路)

  • 如果字符串被零散分布或字符间带 NUL(UTF-16),先做 UTF-16 解码再 grep。
  • 对于高熵小段(可能是压缩/加密),用 xxdhexdump 查看该节附近是否有可疑长度标识。
  • 尝试对常见单字节 XOR 密钥(0x00..0xff)做批量解码并再次运行域名/IP 正则以发现被 XOR 隐藏的字符串(注意:我可以给出脚本帮你在本地跑,但不会给出用于攻击的进一步说明)。

示例 Python(扫描单字节 XOR 恢复域名):

# 把文件读出为 bytes,然后对每个 key 做 xor,搜索域名正则
import re
data = open('sample.bin','rb').read()
dom_re = re.compile(rb'([a-zA-Z0-9][a-zA-Z0-9\-]{0,62}\.)+[a-zA-Z]{2,63}')
for k in range(1,256):
    dec = bytes(b ^ k for b in data)
    if dom_re.search(dec):
        print("maybe xor key:", k, "match:", dom_re.search(dec).group(0))

(这是用于发现被单字节 XOR 混淆的域名;如果你需要我也可以在我这边对上传的文件跑它。)


输出报告模板

  • 文件基础信息(文件名/大小/类型/哈希 MD5+SHA1+SHA256)
  • 抽取到的字符串样本(带偏移/节信息)
  • IOCs(独立清单:域名、IP、URL、base64、mutex、User-Agent)
  • 可疑代码段/资源(例如:某节含大量 base64、可疑导入函数)
  • 证据导出(如何保存原始日志/strings 输出,并记录 chain-of-custody)
  • 建议的检测规则(YARA、Zeek/Suricata 简单规则)与处置建议(禁用/隔离/进一步动态分析)

 

发表在 安全分析 | 留下评论