+++ 
title = "Logging & Syslog" 
chapter = false 
weight = 50 
pre = "6. " 
+++

# 📊 Logging & Syslog

Cazalla includes a complete logging system that records all Mythic events and sends them to a central syslog server for analysis and auditing.

## 🎯 Description

Cazalla's logging system:

- ✅ **Logs ALL events** from Mythic automatically
- ✅ **Does not modify the agent** (avoids detections)
- ✅ **Runs on the server**, not on the target
- ✅ **Sends logs to syslog** central for analysis
- ✅ **Saves local logs** as backup
- ✅ **Structured JSON format** for easy parsing

## 📋 Logged Events

The logger automatically captures all these events:

| Event | Description |
|--------|-------------|
| **CALLBACK** | When an agent connects or checks in |
| **TASK** | When a task is created or updated (commands executed) |
| **RESPONSE** | Agent responses (command output) |
| **CREDENTIAL** | Captured credentials |
| **KEYLOG** | Keystrokes captured by the keylogger |
| **FILE** | Files uploaded or downloaded |
| **ARTIFACT** | Generated artifacts (IOCs, processes created, etc.) |
| **PAYLOAD** | Created payloads |

## ⚙️ Configuration

### Step 1: Configure the Logger

The logger is configured via a configuration file. **You don't need to modify docker-compose.yml**.

1. **Edit the configuration file:**
   ```bash
   nano Payload_Type/cazalla/logger/syslog.conf
   ```

2. **Configure the syslog server IP:**
   ```bash
   # If rsyslog is on the same host as Mythic, use the host IP
   SYSLOG_SERVER=10.8.20.50
   
   # Or if using Docker bridge
   SYSLOG_SERVER=172.17.0.1
   
   # Port (default 514)
   SYSLOG_PORT=514
   
   # Syslog facility (16 = LOCAL0, recommended)
   SYSLOG_FACILITY=16
   ```

3. **Rebuild and restart the container:**
   ```bash
   cd /opt/mythic
   sudo ./mythic-cli build cazalla
   sudo ./mythic-cli restart cazalla
   ```

### Step 2: Configure rsyslog on the Host (Optional)

If you want to receive logs on the same server where Mythic runs:

1. **Install rsyslog** (if not installed):
   ```bash
   sudo apt-get update && sudo apt-get install -y rsyslog
   ```

2. **Enable UDP reception** in `/etc/rsyslog.conf`:
   ```bash
   sudo sed -i 's/#module(load="imudp")/module(load="imudp")/' /etc/rsyslog.conf
   sudo sed -i 's/#input(type="imudp" port="514")/input(type="imudp" port="514")/' /etc/rsyslog.conf
   ```

3. **Create rule for Cazalla** in `/etc/rsyslog.d/50-cazalla.conf`:
   ```bash
   sudo bash -c 'cat > /etc/rsyslog.d/50-cazalla.conf << EOF
   # Logs from Cazalla Mythic agent
   # Filter by facility LOCAL0 (16)
   if \$syslogfacility-text == "local0" then /var/log/cazalla.log
   & stop
   EOF
   '
   ```

4. **Restart rsyslog:**
   ```bash
   sudo systemctl restart rsyslog
   sudo systemctl enable rsyslog
   ```

5. **Verify it's listening:**
   ```bash
   sudo netstat -ulnp | grep 514
   # You should see: UNCONN ... 0.0.0.0:514 ... rsyslogd
   ```

## 📊 Verification

### Verify Logger is Active

```bash
# View container logs
sudo docker logs cazalla | grep -i "syslog\|Logger initialized"

# You should see:
# INFO:cazalla_logger:Syslog client initialized: 10.8.20.50:514 (facility=16)
# INFO:cazalla_logger:Logger initialized: cazalla_logger
```

### View Logs in Real-Time

```bash
# View logs in syslog (host)
sudo tail -f /var/log/cazalla.log

# View local logs (inside container)
sudo docker exec cazalla tail -f /tmp/cazalla_mythic_$(date +%Y-%m-%d).log
```

### View Specific Events

```bash
# View only tasks
sudo tail -100 /var/log/cazalla.log | grep '"event_type": "TASK"'

# View only responses
sudo tail -100 /var/log/cazalla.log | grep '"event_type": "RESPONSE"'

# Count events by type
sudo tail -1000 /var/log/cazalla.log | grep -o '"event_type": "[^"]*"' | sort | uniq -c
```

## 📝 Log Format

Logs are saved in structured JSON format for easy parsing:

```json
{
  "event_type": "TASK",
  "timestamp": "2025-11-17T15:18:23.117715674Z",
  "operation_id": 1,
  "operation_name": "Operation Chimera",
  "username": "mythic_admin",
  "action": "new_task",
  "server_name": "mythic",
  "data": {
    "id": 18,
    "command_name": "shell",
    "params": "{\"command\":\"whoami\"}",
    "status": "success",
    "callback_id": 2,
    "operator_username": "mythic_admin",
    ...
  }
}
```

### Log Locations

- **Syslog (host)**: `/var/log/cazalla.log`
- **Local logs (container)**: `/tmp/cazalla_mythic_YYYY-MM-DD.log`
  - One file per day
  - No rotation (all files are kept)
  - Format: `cazalla_mythic_2025-11-17.log`

## 🔍 Usage Examples

### Search for a Specific Command

```bash
# Search for all 'whoami' executions
sudo grep -i "whoami" /var/log/cazalla.log | grep '"event_type": "TASK"'
```

### View Operator Activity

```bash
# View all events from a user
sudo grep '"username": "mythic_admin"' /var/log/cazalla.log
```

### View Captured Credentials

```bash
# View credential events
sudo grep '"event_type": "CREDENTIAL"' /var/log/cazalla.log
```

### Analyze Generated Artifacts

```bash
# View all artifacts (detected IOCs)
sudo grep '"event_type": "ARTIFACT"' /var/log/cazalla.log
```

## 🛠️ Troubleshooting

### Logger Doesn't Appear in Mythic GUI

**Solution:**
1. Verify the logger is imported in `main.py`
2. Rebuild the container: `sudo ./mythic-cli build cazalla`
3. Restart: `sudo ./mythic-cli restart cazalla`

### Don't See "Syslog client initialized"

**Solution:**
1. Verify `SYSLOG_SERVER` has a value in `syslog.conf`:
   ```bash
   sudo docker exec cazalla cat /Mythic/logger/syslog.conf | grep SYSLOG_SERVER
   ```
2. Rebuild the container if you just edited the file

### Messages Not Reaching Syslog

**Solution:**
1. Verify rsyslog is listening: `sudo netstat -ulnp | grep 514`
2. Verify connectivity from container to host
3. Verify rsyslog configuration: `sudo cat /etc/rsyslog.d/50-cazalla.conf`
4. Verify firewall: `sudo iptables -L -n | grep 514`

### Logs Are Empty

**Solution:**
- Logs only appear when there's activity in Mythic
- Execute a command on an agent to generate events
- Verify the agent is connected and active

## 📚 Advanced Configuration

### Change Syslog Facility

The syslog facility determines how messages are categorized. By default, `16` (LOCAL0) is used.

To change the facility, edit `syslog.conf`:

```bash
# Use AUTH (4) for security logs
SYSLOG_FACILITY=4

# Or use LOCAL1 (17)
SYSLOG_FACILITY=17
```

Then update the rsyslog rule to filter by the new facility.

### Send to Multiple Syslog Servers

To send to multiple servers, you would need to modify the logger code or use an intermediate syslog server that forwards messages.

### SIEM Integration

The JSON formatted logs can be easily integrated with SIEMs such as:
- Splunk
- ELK Stack (Elasticsearch, Logstash, Kibana)
- Graylog
- QRadar

Simply configure the SIEM to read from `/var/log/cazalla.log` or from the central syslog server.

## 🔗 References

- [Logger Technical Documentation](../Payload_Type/cazalla/logger/README.md)
- [Mythic Logging Documentation](https://docs.mythic-c2.net/customizing/3.-consuming-containers/logging)
- [RFC 3164 - The BSD syslog Protocol](https://tools.ietf.org/html/rfc3164)

---

**Note:** The logging system is active by default. You only need to configure the syslog server if you want to centralize logs.
