DragonFlyBSD Kernel Audit
DF-0779 / diag2.c
← back to finding ↓ download raw
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdint.h>
static void put32(uint8_t**p,uint32_t v){v=htonl(v);memcpy(*p,&v,4);*p+=4;}
static void putn(uint8_t**p,const void*src,size_t n){memcpy(*p,src,n);*p+=n;}
static size_t make_auth_unix(uint8_t*body){
 uint8_t*b=body; put32(&b,0x12345678);
 const char*mach="dfbsd"; size_t mlen=strlen(mach),pad=(mlen+3)&~3u;
 put32(&b,(uint32_t)mlen); putn(&b,mach,mlen); b+=mlen; if(pad>mlen){memset(b,0,pad-mlen);b+=pad-mlen;}
 put32(&b,0); put32(&b,0); put32(&b,0);
 return b-body;
}
int main(int argc,char**argv){
 uint16_t port=argc>1?atoi(argv[1]):792;
 uint32_t prog=argc>2?atoi(argv[2]):100005;
 uint32_t vers=argc>3?atoi(argv[3]):3;
 uint32_t proc=argc>4?atoi(argv[4]):1;
 struct sockaddr_in sin; memset(&sin,0,sizeof sin);
 sin.sin_family=AF_INET; sin.sin_port=htons(port); sin.sin_addr.s_addr=inet_addr("127.0.0.1");
 const char* path="/tmp/df0779_export";
 size_t plen=strlen(path),padd=(plen+3)&~3u;
 uint8_t args[256],*a=args; put32(&a,(uint32_t)plen); putn(&a,path,plen); a+=plen; if(padd>plen){memset(a,0,padd-plen);a+=padd-plen;}
 int alen=a-args;
 uint8_t req[256],*q=req;
 put32(&q,0x1234); put32(&q,0); put32(&q,2); put32(&q,prog); put32(&q,vers); put32(&q,proc);
 uint8_t authbuf[256]; size_t authlen=make_auth_unix(authbuf);
 put32(&q,1); put32(&q,(uint32_t)authlen); putn(&q,authbuf,authlen);
 put32(&q,0); put32(&q,0);
 putn(&q,args,alen);
 int rl=q-req;
 int s=socket(AF_INET,SOCK_DGRAM,0);
 struct timeval tv={.tv_sec=5}; setsockopt(s,SOL_SOCKET,SO_RCVTIMEO,&tv,sizeof tv);
 connect(s,(struct sockaddr*)&sin,sizeof sin);
 send(s,req,rl,0);
 uint8_t rep[4096]; int n=recv(s,rep,sizeof rep,0);
 printf("prog=%u vers=%u proc=%u port=%u reply n=%d\n",prog,vers,proc,port,n);
 if(n>0){for(int i=0;i<n;i++){printf("%02x ",rep[i]); if((i&15)==15)printf("\n");}printf("\n");
  /* parse */
  uint8_t*p=rep; uint32_t xid,mt,rs;
  memcpy(&xid,p,4);p+=4; memcpy(&mt,p,4);p+=4;mt=ntohl(mt);
  memcpy(&rs,p,4);p+=4;rs=ntohl(rs);
  printf("mtype=%u reply_stat=%u ",mt,rs);
  if(rs==0){uint32_t vf,vl,ast;memcpy(&vf,p,4);p+=4;vf=ntohl(vf);memcpy(&vl,p,4);p+=4;vl=ntohl(vl);p+=vl;memcpy(&ast,p,4);p+=4;ast=ntohl(ast);printf("verf_flavor=%u verf_len=%u accept_stat=%u\n",vf,vl,ast);}
  else {uint32_t rej,as; memcpy(&rej,p,4);p+=4;rej=ntohl(rej); memcpy(&as,p,4);as=ntohl(as);printf("reject_stat=%u auth_stat=%u\n",rej,as);}
 }
 close(s);return 0;
}