1、爬虫
题目提示robot,这是当然要进网站robots.txt看看有啥了。
----------(分割线)
注:robots.txt是网站管理者写给robots(一般代表爬虫程序或搜索引擎)的内容,里面描述了网站管理者不希望爬虫做的事,比如:
- 不允许访问某个文件、文件夹
- 允许或禁止某些搜索引擎的访问
- 限制爬虫访问网站的频率
- 更多robots.txt内容了解:如何使用robots.txt及其详解_/robots.txt-CSDN博客
-----------
在url后面加上/robots.txt后回车
得到:
可以看到有一个文件目录,是一串数字加字母???
加到url后面看看...
进去了,点一下试试,
flag!!!!
2、AES加解密
给了一个页面,如图,CyberChef
注意图中红方框的内容,aes加密方式,密钥key、初始化向量IV的值,编码方式UTF-8,加密模式(Mode)CBC,输入(input)原文raw,输出(output)十六进制hex
点了点页面,没反应,好吧,看来得用自己的工具
这里用离线下载的CyberChef
----------
注:CyberChef是一个网页版加解密编码解码的工具,挺方便,有在线版本,也可以离线下载到自己电脑上,建议下载到自己电脑上
在线:https://cyberchef.org/,在线版服务器部署在国外,访问可能有点慢
离线下载:https://github.com/gchq/CyberChef/releases,可以网上查查怎么搭建,教程很多
----------
打开自己的CyberChef
对应给的赛题页面信息,
第一步输入aes加密方法,第二步双击选择AES Decrypt模块(解密模块),也就是第二个,第三步输入key、IV值,赛题已经给出了,并且选择对应的编码方式UTF-8,选择加密模式CBC,这里注意,输入(input)要选择Hex(因为密文输出时为Hex),输出(output)为raw,第四步把密文放到输入大框框里,第五步点击处理,就会看到flag了
这里给出密文,感兴趣的伙伴可以自己下载去试试
4da72144967f1c25e6273950bf29342aae635e2396ae17c80b1bff68d90f16679bb45c15852e0ce88d4864d93e9e3be2
3、wireshark流量分析
拿到赛题,进行解压,得到
从wireshark打开
----------
注:wireshark是一个网络流量包分析工具,可以把经过网卡的所有数据包都记录下来,进行分析查看,具体安装使用可以上网搜索
----------
先ctrl+f搜索:flag,记不住快捷键可以点击编辑->查找分组,然后输入flag,前面选择字符串,直接回车,或者点击查找
可以看到定位到了第144条数据包,http协议,get传参,观察info,看到一些可疑的内容,shell.php、system、cat、flag、base64,选择这条数据,右键选择追踪流
----------
这里为什么要右键,是因为wireshark抓到的包,直观看去(就是下面那部分),基本只能看一下各层协议或者标识啥的,大概按TCP/IP层次模型分开(本人理解,不代表真实结果),所以看流量包具体内容,基本要从tcp流量包(传输层)或者http流量包(应用层)那里去看,看看流量包里面的内容有啥
----------
这里选择http或者tcp都行,因为如图,都一样,你要问不一样是啥样,还没探究,不知道
从request请求体可以看到,get传参,有个木马文件shell.php,通过1337口令,传递并执行了system系统命令,又通过cat命令查看flag的内容,flag经过了base64编码,响应体response响应成功,返回了一串base64编码字符串
ZmxhZ3s3ZDZmMTdhNC0yYjBhLTQ2N2QtOGE0Mi02Njc1MDM2OGMyNDl9Cg==
可以用aes题目中的那个工具CyberChef,也可以用在线工具
直接输入base64,选择第二个模块,用于base64解码,直接将编码字符串输入到input框中,处理即可得出falg
4、RSA加密算法
不了解RSA加密的伙伴可以上网查查看,有很多资料,建议配合视频图片,更易于理解
题目是.py文件,代码如下,所有文字注释为我自己后面所写,原题没有文字注释
from Crypto.Util.number import *
from gmpy2 import *
flag = b'xxx' # flag被代替了,也可以理解为隐藏了
m = bytes_to_long(flag) # m是将字节串flag转化成了长整型数字,也就是明文
p = getPrime(512) # p是一个512为的素数
q = next_prime(p) # q是p后面的一个素数
e = 65537 # 公钥e
n = p * q # 大整数n
phi = (p - 1) * (q - 1) # n的欧拉值
d = inverse(e, phi) # 私钥d
d1 = d % q
d2 = d % p
# d1和d2应该是用于混淆,就是没有用的条件
c = pow(m, e, n) # 得出密文
print(n)
print(d1)
print(d2)
print(c)
# 这里的四个输出每次运行都不一样,因为p每次取值都是随机的,导致后面的值都是随机的
# 94581028682900113123648734937784634645486813867065294159875516514520556881461611966096883566806571691879115766917833117123695776131443081658364855087575006641022211136751071900710589699171982563753011439999297865781908255529833932820965169382130385236359802696280004495552191520878864368741633686036192501791
# 4218387668018915625720266396593862419917073471510522718205354605765842130260156168132376152403329034145938741283222306099114824746204800218811277063324566
# 9600627113582853774131075212313403348273644858279673841760714353580493485117716382652419880115319186763984899736188607228846934836782353387850747253170850
# 36423517465893675519815622861961872192784685202298519340922692662559402449554596309518386263035128551037586034375613936036935256444185038640625700728791201299960866688949056632874866621825012134973285965672502404517179243752689740766636653543223559495428281042737266438408338914031484466542505299050233075829
# 这里的四个很大的整数,是已知的条件,第一个是大整数n,第二个和第三个没啥用,第四个是密文c
----------
引用解释:
Crypto.Util.number这个引用要下载pyCryptodome库才可以使用,pyCryptodome库是实现各种算法和协议的密码模块的集合,包含Cipher,Hash,Protocol,PublicKey,Signature,Util这些子包。 通过以下命令来下载
pip3 install pyCryptodome -i https://pypi.douban.com/simple
gmpy2是一个Python扩展模块,是对GMP的封装,它的前身是gmpy。
GMP(GNU Multiple Precision Arithmetic Library,即GNU高精度算术运算库),它是一个开源的高精度运算库,其中不但有普通的整数、实数、浮点数的高精度运算,还有随机数生成,尤其是提供了非常完备的数论中的运算接口,比如Miller-Rabin素数测试算法、大素数生成、欧几里德算法、求域中元素的逆、Jacobi符号、legendre符号等。
pip install gmpy2
这里安装gmpy2时,网上说要先装wheel,但我没装,也能用,大家安装的时候自己试吧。
----------
RSA逆运算代码
(代码来自网上大佬(https://blog.csdn.net/m0_74345946/article/details/138250482),注释是我自己写的,大佬侵权私信)
from gmpy2 import *
from Crypto.Util.number import *
# 给出相关函数的解释
e = 65537
n = 94581028682900113123648734937784634645486813867065294159875516514520556881461611966096883566806571691879115766917833117123695776131443081658364855087575006641022211136751071900710589699171982563753011439999297865781908255529833932820965169382130385236359802696280004495552191520878864368741633686036192501791
# e:公钥,n:大整数
c = 36423517465893675519815622861961872192784685202298519340922692662559402449554596309518386263035128551037586034375613936036935256444185038640625700728791201299960866688949056632874866621825012134973285965672502404517179243752689740766636653543223559495428281042737266438408338914031484466542505299050233075829
# c:密文
# 上面的参数是已知的
temp = iroot(n, 2)[0]
# gmpy2.iroot(x,y),计算x的y次方根,即将x开y次根号,该函数返回一个含有两个值的元组,
# 第一个值为x开y次根号的值,第二个值为true/faule,代表第一个值的精确度,true代表第一个值是精确的,faule代表第一个值是近似值
# [0]代表取元组第一个值
q = next_prime(temp) # gmpy.next_prime(n),取相对于n的下一个素数。这里求出了一个素数q
p = n // q # 得到另一个素数p
phi = (p - 1) * (q - 1) # 得到n的欧拉值,即phi,该phi在RSA算法中用于得到公钥e和私钥d,e的条件:1<e<phi,且e和phi互素;d*e=1(mod(phi))
d = inverse(e, phi) # 来自Crypto.Util.number库,inverse(x,y),求 x模y 的 逆元,即x*y=1(mody);这里得到私钥d
m = powmod(c, d, n) # gmpy2.powmod(x,y,z),求 x的y次 模z 的 余数;根据RSA解密公式,得到明文m
print(long_to_bytes(m)) # 此时的明文m为长整型数字,使用long_to_bytes()函数将其转换为字节串,得到flag
运行得到flag:
后续.......
新人小白,文章有错误的地方,麻烦大佬们评论区指正。