====== ntpQuery ======
Simple C program for checking an NTP server. The ''nmap'' script is too slow.
Build with
gcc -o ntpQuery ntpQuery.c
Run with
./ntpQuery 172.16.0.2
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define NTP_PORT 123
#define NTP_PACKET_SIZE 48
#define NTP_TIMESTAMP_DELTA 2208988800UL
typedef struct {
uint8_t li_vn_mode;
uint8_t stratum;
uint8_t poll;
uint8_t precision;
uint32_t root_delay;
uint32_t root_dispersion;
uint32_t ref_id;
uint32_t ref_ts_secs;
uint32_t ref_ts_frac;
uint32_t orig_ts_secs;
uint32_t orig_ts_frac;
uint32_t recv_ts_secs;
uint32_t recv_ts_frac;
uint32_t trans_ts_secs;
uint32_t trans_ts_frac;
} ntp_packet;
int main(int argc, char *argv[]) {
if (argc != 2) {
fprintf(stderr, "Usage: %s \n", argv[0]);
exit(1);
}
int sockfd;
struct hostent *server;
struct sockaddr_in serv_addr;
ntp_packet packet = { 0 };
packet.li_vn_mode = 0x1b; // LI = 0, VN = 3, Mode = 3 (client)
sockfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
if (sockfd < 0) {
perror("Error opening socket");
exit(1);
}
server = gethostbyname(argv[1]);
if (server == NULL) {
fprintf(stderr, "Error resolving hostname\n");
exit(1);
}
memset(&serv_addr, 0, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
memcpy(&serv_addr.sin_addr.s_addr, server->h_addr, server->h_length);
serv_addr.sin_port = htons(NTP_PORT);
if (sendto(sockfd, &packet, sizeof(ntp_packet), 0,
(struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) {
perror("Error sending packet");
exit(1);
}
struct timeval timeout = {1, 0}; // 1 second timeout
setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, &timeout, sizeof(timeout));
socklen_t addr_len = sizeof(serv_addr);
if (recvfrom(sockfd, &packet, sizeof(ntp_packet), 0,
(struct sockaddr *)&serv_addr, &addr_len) < 0) {
perror("Error receiving packet");
exit(1);
}
packet.ref_id = ntohl(packet.ref_id);
packet.ref_ts_secs = ntohl(packet.ref_ts_secs);
time_t time = packet.ref_ts_secs - NTP_TIMESTAMP_DELTA;
char refid[5] = {0};
memcpy(refid, &packet.ref_id, 4);
printf("Reference ID: %08X ", packet.ref_id);
for(int i = 3; i >= 0; i--) {
if(refid[i] >= 32 && refid[i] <= 126) {
printf("%c", refid[i]);
}
}
printf("\n");
printf("Reference Time: %s", ctime(&time));
close(sockfd);
return 0;
}