/** * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * * Name : Project Riddle * Author : Andrea Bontempi * Version : 0.1 aplha * Description : Modular Network Sniffer * * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * * This file is part of the project Riddle. * * The project Riddle is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * The project Riddle is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this project. If not, see . * * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - */ #include #include #include #include #include #include #include #include "./libraries/libCigarette.h" #include "./commons/classMacAddress.h" #include "./commons/classPacket.h" #include "./commons/libDump.h" using namespace std; using namespace boost; using namespace boost::program_options; using namespace libNetwork; int main ( int argc, char **argv ) { options_description desc ( "Cigarette - Network Packet Parser" ); desc.add_options() ( "help,h", "prints this" ) ( "ipv4,4", "expand IPv4 info" ) ( "tcp,t", "expand TCP info" ) ( "icmp,i", "expand ICMP info" ) ( "payload,p", "print payload dump" ) ; variables_map vm; try { store ( parse_command_line ( argc, argv, desc ), vm ); notify ( vm ); } catch ( boost::program_options::unknown_option ex1 ) { cerr << "ERROR >> " << ex1.what() << "" << endl; cerr << ">> Try '" << argv[0] << " --help' for more information." << endl; return EXIT_SUCCESS; } catch ( boost::program_options::invalid_command_line_syntax ex2 ) { cerr << "ERROR >> " << ex2.what() << "" << endl; cerr << ">> Try '" << argv[0] << " --help' for more information." << endl; return EXIT_SUCCESS; } if ( vm.count ( "help" ) ) { cout<getEpoch() << " " << setfill ( '0' ) << setw ( 6 ) << pkg->getMillis() << "] Size: " << pkg->getPacketLength() << " byte" << endl; cout << " From " << pkg->getSenderMac().to_string() << " to "<< pkg->getTargetMac().to_string() << endl; cout << " EtherType: 0x" << std::hex << pkg->getEtherType() << " ("<< ether_type_decode ( pkg->getEtherType() ) << ")" << endl; cout << endl; if ( pkg->isArp() ) { ARPpacket *pkg_arp = dynamic_cast ( pkg ); if ( pkg_arp->getOpCode() == 1 ) { cout << " Who has " << pkg_arp->getTargetIp().to_string() << " ? Tell "<< pkg_arp->getSenderIp().to_string() << endl; cout << endl; } else { cout << " " << pkg_arp->getSenderIp().to_string() << " is at "<< pkg->getSenderMac().to_string() << endl; cout << endl; } } else if ( pkg->isIPv4() ) { IPv4packet *pkg_ipv4 = dynamic_cast ( pkg ); cout << " From " << pkg_ipv4->getSenderIp().to_string() << " to "<< pkg_ipv4->getTargetIp().to_string() << endl; cout << " ProtocolType: 0x" << pkg_ipv4->getProtocolType() << " ("<< ipv4_type_decode ( pkg_ipv4->getProtocolType() ) << ")" << endl; if ( vm.count ( "ipv4" ) ) { cout << " + Flags "; if ( pkg_ipv4->isDF() ) cout << "Don't Fragment "; if ( pkg_ipv4->isMF() ) cout << "More Fragments "; cout << endl; cout << " + Time To Live " << std::dec << pkg_ipv4->getTTL() << endl; cout << " + Identification 0x" << std::hex << pkg_ipv4->getIdentity() << endl;; cout << " + Checksum 0x" << std::hex << pkg_ipv4->getIPChecksum(); if ( pkg_ipv4->verifyIPChecksum() ) { cout << " (Correct) "; } else { cout << " (Invalid) "; } cout << endl; } cout << endl; if ( pkg_ipv4->isTCP() ) { TCPv4packet* pkg_tcpv4 = dynamic_cast ( pkg ); cout << " From port " << std::dec << pkg_tcpv4->getSenderPort() << " to port " << pkg_tcpv4->getTargetPort() << endl; if ( vm.count ( "tcp" ) ) { cout << " + Sequence Number " << pkg_tcpv4->getSequenceNumber() << endl; cout << " + Next Sequence Number " << pkg_tcpv4->getSequenceNumber() + pkg_tcpv4->getPayloadLength() << endl; cout << " + Acknowledgment Number " << pkg_tcpv4->getAcknowledgmentNumber() << endl; cout << " + Header Length " << pkg_tcpv4->getHeaderLength() << " byte" << endl; cout << " + Payload Length " << pkg_tcpv4->getPayloadLength() << " byte" << endl; cout << " + Window Size " << pkg_tcpv4->getWindowSize() << " byte" << endl; cout << " + Flags "; if ( pkg_tcpv4->isSYN() ) cout << "SYN "; if ( pkg_tcpv4->isFIN() ) cout << "FIN "; if ( pkg_tcpv4->isRST() ) cout << "RST "; if ( pkg_tcpv4->isACK() ) cout << "ACK "; if ( pkg_tcpv4->isPSH() ) cout << "PSH "; if ( pkg_tcpv4->isURG() ) cout << "URG "; if ( pkg_tcpv4->isECE() ) cout << "ECE "; if ( pkg_tcpv4->isCWR() ) cout << "CWR "; cout << endl; cout << " + Checksum 0x" << std::hex << pkg_tcpv4->getTCPChecksum() << endl; cout << " + Urgent Pointer 0x" << std::hex << pkg_tcpv4->getUrgentPointer() << endl; std::map options = pkg_tcpv4->getOptionMap(); if ( pkg_tcpv4->isOption() ) { std::map::const_iterator itr; for ( itr = options.begin(); itr != options.end(); ++itr ) { cout << " + Option " << ( *itr ).first << " -> " << ( *itr ).second << endl; } } } if ( vm.count ( "payload" ) ) { cout << " + Payload:" << endl; cout << libDump::classicDump ( pkg_tcpv4->getPayLoad() ) << endl; } cout << endl; } else if ( pkg_ipv4->isUDP() ) { UDPv4packet* pkg_udpv4 = dynamic_cast ( pkg ); cout << " From port " << std::dec << pkg_udpv4->getSenderPort() << " to port " << pkg_udpv4->getTargetPort() << endl; cout << endl; } else if ( pkg_ipv4->isICMP() ) { ICMPv4packet* pkg_icmpv4 = dynamic_cast ( pkg ); cout << " Message Type: " << pkg_icmpv4->getMessageType() << " (" << icmpv4_type_decode ( pkg_icmpv4->getMessageType() ) << ")" << endl; if ( vm.count ( "icmp" ) ) { cout << " Message Code: " << pkg_icmpv4->getMessageCode() << endl; } cout << endl; } else { cout << " Unknown Packet" << endl; cout << endl; } } else { cout << " Unknown Packet" << endl; cout << endl; } delete pkg; } catch ( packet::Overflow ) { std::cerr<<"Overflow! :-P"<