M. Raihan

38 papers C 1Journal 8Unranked 29
YearRankTypeTitle / Venue / Authors
2024 conf
ICCA
Md. Shymon Islam, Ehsanul Imon, M. Raihan, Md Musab Noor, Tasmin Jabin Rasa, Isfat Ara Hasan Ema
2024 J jnl
IEEE Access
M. Raihan, Anjan Debnath, Prokash Chondra Adhikary, Mehedi Masud, Hossam Meshref, Anupam Kumar Bairagi
2024 conf
ICCCNT
Rasmy Akter, Md. Motiur Rahman, Anjan Debnath, Nadim Samrat, Marjana Roman, Abu Naim Khan, Nasif Alvi, M. Raihan
2024 J jnl
Data Intell.
M. Raihan, Sami Azam, Laboni Akter, Md. Mehedi Hassan, Ryana Quadir, Asif Karim, Saikat Mondal, Arun More
2023 J jnl
Hum. Centric Intell. Syst.
Md. Mehedi Hassan, Md. Mahedi Hassan, Swarnali Mollick, Md. Asif Rakib Khan, Farhana Yasmin, Anupam Kumar Bairagi, M. Raihan, Shibbir Ahmed Arif, Amrina Rahman
2023 J jnl
Sensors
Anjan Debnath, Md. Mahedi Hasan, M. Raihan, Nadim Samrat, Mashael M. Alsulami, Mehedi Masud, Anupam Kumar Bairagi
2023 J jnl
Innov. Syst. Softw. Eng.
Md. Mehedi Hassan, Sadika Zaman, Swarnali Mollick, Md. Mahedi Hassan, M. Raihan, Chetna Kaushal, Rajat Bhardwaj
2023 conf
ICCCNT
Md. Humayun Kabir, Nadim Samrat, Abdullah Al Mahmud, Rasmy Akter, M. Raihan
2023 J jnl
CoRR
Md Aminul Islam, Shabbir Ahmed Shuvo, Mohammad Abu Tareq Rony, M. Raihan, Md. Abu Sufian
2022 conf
ICCA
Md. Mehedi Hassan, M. Raihan, Md. Hasanul Banna Khan, Tutul Dhali, Md. Mushfiqur Rahman, Zarmina Huda Sneha
2022 conf
ICCA
Rahul Deb Mohalder, Juliet Polok Sarkar, Khandkar Asif Hossain, Laboni Paul, M. Raihan
2022 conf
ICCA
Apu Sarder, M. Raihan, Md. Mehedi Hassan, Nasif Alvi, Md Mehedi Hasan Rabbi, M. D. Hasan Mirja
2022 conf
MIET (1)
Rahul Deb Mohalder, Khandkar Asif Hossain, Juliet Polok Sarkar, Laboni Paul, M. Raihan, Kamrul Hasan Talukder
2022 conf
ICCCNT
M. Raihan, Nasif Alvi, Anupam Kumar Bairagi
2021 J jnl
Intell. Autom. Soft Comput.
Mounita Ghosh, Md. Mohsin Sarker Raihan, M. Raihan, Laboni Akter, Anupam Kumar Bairagi, Sultan S. Alshamrani, Mehedi Masud
2021 conf
ICCCNT
Md. Al-Mamun Billah, Md. Mehedi Hassan, M. Raihan, Swarnali Mollick, Md. Mehadi Hasan Shakil, Jarif Huda Angon
2021 conf
ICCCNT
M. Raihan, Anupam Kumar Bairagi, Shagoto Rahman
2021 J jnl
Hum. Centric Intell. Syst.
Md. Mehedi Hassan, Md. Mahedi Hassan, Laboni Akter, Md. Mushfiqur Rahman, Sadika Zaman, Khan Md. Hasib, Nusrat Jahan, Raisun Nasa Smrity, Jerin Farhana, M. Raihan, Swarnali Mollick
2021 conf
ICO
Promila Ghosh, M. Raihan, Md. Mehedi Hassan, Laboni Akter, Sadika Zaman, Md. Abdul Awal
2021 conf
ICO
Khandkar Asif Hossain, M. Raihan, Avijit Biswas, Juliet Polok Sarkar, Suriya Sultana, Kajal Sana, Keya Sarder, Nilanjana Majumder
2021 conf
ICO
Juliet Polok Sarkar, M. Raihan, Avijit Biswas, Khandkar Asif Hossain, Keya Sarder, Nilanjana Majumder, Suriya Sultana, Kajal Sana
2021 conf
ICCCNT
Shagoto Rahman, M. Raihan, Sabia Khatun Mithila
2020 conf
ICCA
M. Raihan, Md Tanvir Islam, Promila Ghosh, Jarif Huda Angon, Md. Mehedi Hassan, Fahmida Farzana
2020 conf
ICCCNT
Sajib Kabiraj, M. Raihan, Nasif Alvi, Marina Afrin, Laboni Akter, Shawmi Akhter Sohagi, Etu Podder
2020 conf
ICCCNT
Etu Podder, Abdullah Al-Mamun Bulbul, Md. Bellal Hossain, Md. Ekhlasur Rahaman, Himadri Shekhar Mondal, M. Raihan, Sajib Kabiraj, Md. Mahmudul Hasan, Ahmed Saif Muntaseer
2020 conf
ICCCNT
Md Tanvir Islam, M. Raihan, Nasrin Aktar, Md. Shahabub Alam, Romana Rahman Ema, Tajul Islam
2020 conf
ICCCNT
Nazia Anjum Sharupa, Minhaz Rahman, Nasif Alvi, M. Raihan, Afsana Islam, Tanzil Raihan
2020 conf
ICCCNT
M. Raihan, Md Tanvir Islam, Promila Ghosh, Md. Mehedi Hassan, Jarif Huda Angon, Sajib Kabiraj
2020 conf
ICCCNT
Sk. Al Mamun, Md. Mahadi Hassan, Md. Riadul Islam, M. Raihan
2020 conf
ICCCNT
Md Tanvir Islam, M. Raihan, Fahmida Farzana, Nasrin Aktar, Promila Ghosh, Sajib Kabiraj
2019 conf
ICCCNT
Md Tanvir Islam, M. Raihan, Fahmida Farzana, Md. Golam Morshed Raju, Md. Bellal Hossain
2019 conf
ICCCNT
M. Raihan, Md Tanvir Islam, Fahmida Farzana, Md. Golam Morshed Raju, Himadri Shekhar Mondal
2019 C conf
IJCCI
M. Raihan, Nasif Alvi, Md Tanvir Islam, Fahmida Farzana, Md. Mahadi Hassan
2019 conf
ICCCNT
Md. Bellal Hossain, Etu Podder, Abdullah Al-Mamun Bulbul, Himadri Shekhar Mondal, M. Raihan, Md Tanvir Islam
2019 conf
ICCCNT
Himadri Shekhar Mondal, Prianka Bhattacharjee, Md Mahmud Hassan, Md. Bellal Hossain, Ahmed Saif Muntaseer, M. Raihan
2019 conf
ICCCNT
Md. Ekhlasur Rahaman, S. M. Shamsul Alam, Himadri Shekhar Mondal, Ahmed Saif Muntaseer, Rajib Mandal, M. Raihan
2019 conf
ICCCNT
Promila Ghosh, M. Raihan, Md Tanvir Islam, Md. Ekhlasur Rahaman
2018 conf
ICCCNT
Himadri Shekhar Mondal, M. Raihan, Sunanda Roy, Sabyasachi Mondal
redb/extractors/pe_extractors/pe_signature_old.py
← Index redb/extractors/pe_extractors/pe_signature_old.py python
import inspect
import pefile

from hashlib import md5, sha1, sha256

from asn1crypto import cms, pem, x509, core

from redb.extractors.enum import Tag
from redb.extractors.pe_extractor import PEExtractor
from redb.models.dataclasses import PECertificate, PESigner


class PESignatureExtractor(PEExtractor):
    """
    RFC 3161 - Internet X.509 Public Key Infrastructure Time-Stamp Protocol (TSP)
    Section 2.4.2 defines the TSTInfo structure.
    https://tools.ietf.org/html/rfc3161#section-2.4.2

    Microsoft Authenticode Time Stamping Specification
    https://download.microsoft.com/download/9/c/5/9c5b2167-8017-4bae-9fde-d599bac8184a/Authenticode_PE.docx
    """

    def __init__(
        self,
        filepath,
        log,
        index_prefix=None,
        elastic_index=None,
        known_benign=False,
        known_malicious=False,
        pe=None,
    ):
        super().__init__(
            filepath,
            log,
            index_prefix,
            elastic_index,
            known_benign,
            known_malicious,
            pe,
        )
        self.elastic_index = self.index_prefix + "-pe_signature"
        self.log.debug(inspect.currentframe().f_code.co_name)

    def tag(self):
        return Tag.PE_SIGNATURE.value

    @staticmethod
    def _extract_certificate_info(cert_data):
        # self.log.debug(inspect.currentframe().f_code.co_name)

        certificate = x509.Certificate.load(cert_data)
        certificate_serial_number = format(certificate.serial_number, "x").upper()
        grouped_serial_number = ":".join(
            [
                certificate_serial_number[i : i + 2]
                for i in range(0, len(certificate_serial_number), 2)
            ]
        )
        return PECertificate(
            _id=format(certificate.serial_number, "x").upper(),
            certificate_serial_number=grouped_serial_number,
            certificate_issuer=certificate.issuer.human_friendly,
            certificate_subject=certificate.subject.human_friendly,
            certificate_valid_from=certificate["tbs_certificate"]["validity"][
                "not_before"
            ].native.strftime("%Y-%m-%d %H:%M:%S"),
            certificate_valid_to=certificate["tbs_certificate"]["validity"][
                "not_after"
            ].native.strftime("%Y-%m-%d %H:%M:%S"),
            certificate_thumbprint=sha1(cert_data).hexdigest().upper(),
            certificate_md5=md5(cert_data).hexdigest().upper(),
            certificate_sha256=sha256(cert_data).hexdigest().upper(),
        )

    @staticmethod
    def _parse_microsoft_time_stamp(ts_token):
        class TSTInfo(core.Sequence):
            _fields = [
                ("version", core.Integer),
                ("policy_id", core.ObjectIdentifier),
                ("message_imprint", core.Sequence),
                ("serial_number", core.Integer),
                ("gen_time", core.GeneralizedTime),
                ("accuracy", core.Sequence, {"optional": True}),
                ("ordering", core.Boolean, {"optional": True}),
                ("nonce", core.Integer, {"optional": True}),
                ("tsa", core.Sequence, {"optional": True}),
                ("extensions", core.Sequence, {"optional": True}),
            ]

        # The content should be SignedData
        signed_data = ts_token["content"]

        # The actual timestamp should be in the encapContentInfo
        encap_content_info = signed_data["encap_content_info"]
        tst_info = TSTInfo.load(encap_content_info["content"])

        # Extract the genTime field from TSTInfo, type(genTime): <class 'datetime.datetime'>
        gen_time = tst_info["gen_time"].native

        return gen_time

    def _extract_signer_info(self, signer):
        self.log.debug(inspect.currentframe().f_code.co_name)
        signing_time = None

        for attr_set in [signer["signed_attrs"], signer["unsigned_attrs"]]:
            if attr_set:
                for attribute in attr_set:
                    attr_type = attribute["type"].dotted
                    if attr_type == "1.2.840.113549.1.9.5":  # signingTime
                        signing_time = attribute["values"][0].native
                        break
                    elif (
                        attr_type == "1.3.6.1.4.1.311.3.2.1"
                        or attr_type == "1.3.6.1.4.1.311.3.3.1"
                    ):  # microsoft_time_stamp_token
                        try:
                            ts_token = attribute["values"][0].native
                            signing_time = self._parse_microsoft_time_stamp(ts_token)
                            self.log.debug(
                                f"Signing Time from Microsoft Time Stamp Token: {signing_time}"
                            )
                        except Exception as e:
                            self.log.error(
                                f"Error parsing Microsoft Time Stamp Token: {e}"
                            )
                            self.log.error("Token structure:", attribute["values"][0])
                    elif attr_type == "1.2.840.113549.1.9.6":  # counterSignature
                        counter_sig_values = attribute["values"]
                        for counter_sig_value in counter_sig_values:
                            try:
                                counter_sig_info = cms.SignerInfo.load(
                                    counter_sig_value.native
                                )
                                cs_signed_attrs = counter_sig_info["signed_attrs"]
                                for cs_attr in cs_signed_attrs:
                                    cs_attr_type = cs_attr["type"].dotted
                                    if (
                                        cs_attr_type == "1.2.840.113549.1.9.5"
                                    ):  # signingTime
                                        signing_time = cs_attr["values"][0].native
                                        self.log.debug(
                                            "Signing Time (from countersignature):",
                                            signing_time,
                                        )
                                        break
                                if signing_time:
                                    break
                            except Exception as e:
                                self.log.error(
                                    f"Error processing countersignature: {e}"
                                )
                    if signing_time:
                        break
            if signing_time:
                break
        signer_serial_number = format(
            signer["sid"].native["serial_number"], "x"
        ).upper()
        grouped_serial_number = " ".join(
            [
                signer_serial_number[i : i + 2]
                for i in range(0, len(signer_serial_number), 2)
            ]
        )
        return PESigner(
            # this is to avoid duplicate _id with the Signer certificate used to sign as they are in the same ES index
            _id=format(signer["sid"].native["serial_number"], "x").upper()
            + signer["digest_algorithm"]["algorithm"].native,
            signer_serial_number=grouped_serial_number,
            signer_digest_algorithm=signer["digest_algorithm"]["algorithm"].native,
            signer_signature_algorithm=signer["signature_algorithm"][
                "algorithm"
            ].native,
            signing_time=(
                signing_time.strftime("%Y-%m-%d %H:%M:%S") if signing_time else None
            ),
            # "countersigners": extract_countersigners(signer), # TODO: Implement this
        )

    def _extract_signature_info(self):
        self.log.debug(inspect.currentframe().f_code.co_name)
        address = self.pe.OPTIONAL_HEADER.DATA_DIRECTORY[
            pefile.DIRECTORY_ENTRY["IMAGE_DIRECTORY_ENTRY_SECURITY"]
        ].VirtualAddress
        size = self.pe.OPTIONAL_HEADER.DATA_DIRECTORY[
            pefile.DIRECTORY_ENTRY["IMAGE_DIRECTORY_ENTRY_SECURITY"]
        ].Size

        addr_8 = address + 8
        signature_data = bytes(
            self.pe.write()[addr_8 : addr_8 + size]  # noqa E203
        )  # Ensure this is a bytes object
        if pem.detect(signature_data):
            signature_data = pem.unarmor(signature_data)

        content_info = cms.ContentInfo.load(signature_data)
        signed_data = content_info["content"]

        certificates = signed_data["certificates"]
        signers = signed_data["signer_infos"]

        certificates_list = []
        for cert in certificates:
            cert_info = self._extract_certificate_info(cert.chosen.dump())
            certificates_list.append(cert_info)

        signer_info_list = []
        for signer in signers:
            signer_info = self._extract_signer_info(signer)
            signer_info_list.append(signer_info)

        return certificates_list, signer_info_list

    def extract(self):
        try:
            self.log.debug(inspect.currentframe().f_code.co_name)
            if self._is_signed():
                certificates_list, signers_list = self._extract_signature_info()
                # self.export_to_elastic([PECodeSigning(certificates_list, signers_list)])
                self.export_to_elastic(certificates_list, Tag.PE_CERTIFICATE.value)
                self.export_to_elastic(signers_list, Tag.PE_SIGNER.value)
            return True
        except Exception as e:
            self.log.error(f"Error extracting PE Signature: {e}")
            return None